Noparametrica
2025-05-18
#cargar paquetes#########################################################
#######
install.packages("tidyverse")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("readxl")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("gt")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("car")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("tidyr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyvers
e 2.0.0 ─
## dplyr 1.1.4 readr 2.1.5
## forcats 1.0.0 stringr 1.5.1
## ggplot2 3.5.2 tibble 3.2.1
## lubridate 1.9.4 tidyr 1.3.1
## purrr 1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conf
licts() ─
## dplyr::filter() masks stats::filter()
## dplyr::lag() masks stats::lag()
## Use the conflicted package (<http://conflicted.r-lib.org/>) to force
all conflicts to become errors
library(readxl)
library(gt)
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
##
## The following object is masked from 'package:dplyr':
##
## recode
##
## The following object is masked from 'package:purrr':
##
## some
library(tidyr)
#cargar y depurar los
#datos################################################################
datos_goles <- read_excel("Datos de goles 2018-2024.xlsx")
print("Nombres de las columnas:")
## [1] "Nombres de las columnas:"
print(colnames(datos_goles))
## [1] "ID" "TORNEO" "YEAR" "FASE" "LOCAL" "VISI
TANTE"
## [7] "P1_L" "P1_V" "P2_L" "P2_V" "P3_L" "P3_V
"
## [13] "P4_L" "P4_V" "P5_L" "P5_V" "P6_L" "P6_V
"
## [19] "TN_L" "TN_V" "PR1_L" "PR1_V" "PR2_L" "PR2_
V"
## [25] "TPR_L" "TPR_V" "DURACION" "1_PATEO" "PE1_L" "PE1_
V"
## [31] "PE2_L" "PE2_V" "PE3_L" "PE3_V" "PE4_L" "PE4_
V"
## [37] "PE5_L" "PE5_V" "TPE_L" "TPE_V" "TOTAL_L" "TOTA
L_V"
## [43] "P_GOL_1" "PRIM_GOL" "GANO" "GOL_GAN" "GOL_PERD"
columnas_numericas_nombres <- c(
"ID", "YEAR",
"P1_L", "P1_V", "P2_L", "P2_V", "P3_L", "P3_V", "P4_L", "P4_V",
"P5_L", "P5_V", "P6_L", "P6_V",
"TN_L", "TN_V",
"PR1_L", "PR1_V", "PR2_L", "PR2_V",
"TPR_L", "TPR_V",
"PE1_L", "PE1_V", "PE2_L", "PE2_V", "PE3_L", "PE3_V",
"PE4_L", "PE4_V", "PE5_L", "PE5_V",
"TPE_L", "TPE_V","TOTAL_L", "TOTAL_V","GOL_GAN", "GOL_PERD")
# Convertir las columnas especificadas a numérico------------------------
--------------------------------
for (col_nombre in columnas_numericas_nombres) {
if (col_nombre %in% colnames(datos_goles)) {
datos_goles[[col_nombre]] <- ifelse(datos_goles[[col_nombre]] %in% c(
"No Aplica", "N/A", ""), NA, datos_goles[[col_nombre]])
datos_goles[[col_nombre]] <- as.numeric(datos_goles[[col_nombre]])
} else {
print(paste("Advertencia: La columna", col_nombre, "no se encontró en
los datos para conversión numérica."))
}
}
columnas_categoricas_nombres <- c("TORNEO", "FASE", "LOCAL", "VISITANTE",
"DURACION", "1_PATEO", "PRIM_GOL", "GANO","P_GOL_1")
for (col_nombre in columnas_categoricas_nombres) {
if (col_nombre %in% colnames(datos_goles)) {
datos_goles[[col_nombre]] <- as.factor(datos_goles[[col_nombre]])
} else {
print(paste("Advertencia: La columna", col_nombre, "no se encontró en
los datos para conversión a factor."))
}
}
print("Estructura DESPUÉS de convertir a factor:")
## [1] "Estructura DESPUÉS de convertir a factor:"
str(datos_goles)
## tibble [62 × 47] (S3: tbl_df/tbl/data.frame)
## $ ID : num [1:62] 18 38 40 53 57 7 13 20 42 52 ...
## $ TORNEO : Factor w/ 2 levels "EURO COPA","MUNDIAL": 1 2 2 1 1 2 2
1 2 1 ...
## $ YEAR : num [1:62] 2020 2022 2022 2024 2024 ...
## $ FASE : Factor w/ 5 levels "CF","FI","FI 3",..: 4 4 1 4 1 4 5 4
1 4 ...
## $ LOCAL : Factor w/ 23 levels "Argentina","Austria",..: 11 13 6 15
15 19 9 3 13 9 ...
## $ VISITANTE: Factor w/ 29 levels "Argentina","Australia",..: 3 25 5 2
3 10 26 4 19 19 4 ...
## $ P1_L : num [1:62] 0 0 0 0 0 0 0 0 0 0 ...
## $ P1_V : num [1:62] 0 0 0 0 0 0 0 0 0 0 ...
## $ P2_L : num [1:62] 0 0 0 0 0 0 0 0 0 0 ...
## $ P2_V : num [1:62] 0 0 0 0 0 0 0 0 0 0 ...
## $ P3_L : num [1:62] 0 0 0 0 0 0 0 1 1 0 ...
## $ P3_V : num [1:62] 0 0 0 0 0 0 0 0 0 0 ...
## $ P4_L : num [1:62] 0 0 0 0 0 0 1 0 0 0 ...
## $ P4_V : num [1:62] 0 0 0 0 0 0 0 0 0 0 ...
## $ P5_L : num [1:62] 0 0 0 0 0 1 0 0 0 0 ...
## $ P5_V : num [1:62] 0 0 0 0 0 0 0 0 0 0 ...
## $ P6_L : num [1:62] 0 0 0 0 0 0 0 0 0 1 ...
## $ P6_V : num [1:62] 0 0 0 0 0 0 0 0 0 0 ...
## $ TN_L : num [1:62] 0 0 0 0 0 1 1 1 1 1 ...
## $ TN_V : num [1:62] 0 0 0 0 0 0 0 0 0 0 ...
## $ PR1_L : num [1:62] 2 0 0 0 0 0 0 0 0 0 ...
## $ PR1_V : num [1:62] 0 0 0 0 0 0 0 0 0 0 ...
## $ PR2_L : num [1:62] 0 0 1 0 0 0 0 0 0 0 ...
## $ PR2_V : num [1:62] 1 0 1 0 0 0 0 0 0 0 ...
## $ TPR_L : num [1:62] 2 0 1 0 0 0 0 0 0 0 ...
## $ TPR_V : num [1:62] 1 0 1 0 0 0 0 0 0 0 ...
## $ DURACION : Factor w/ 3 levels "normal","penalties",..: 3 2 2 2 2 1
1 1 1 1 ...
## $ 1_PATEO : Factor w/ 3 levels "local","No Aplica",..: 2 1 1 3 3 2 2
2 2 2 ...
## $ PE1_L : num [1:62] 0 1 1 1 1 0 0 0 0 0 ...
## $ PE1_V : num [1:62] 0 0 0 0 1 0 0 0 0 0 ...
## $ PE2_L : num [1:62] 0 1 1 1 1 0 0 0 0 0 ...
## $ PE2_V : num [1:62] 0 0 1 0 1 0 0 0 0 0 ...
## $ PE3_L : num [1:62] 0 0 1 1 0 0 0 0 0 0 ...
## $ PE3_V : num [1:62] 0 0 1 0 1 0 0 0 0 0 ...
## $ PE4_L : num [1:62] 0 1 1 0 1 0 0 0 0 0 ...
## $ PE4_V : num [1:62] 0 0 0 0 1 0 0 0 0 0 ...
## $ PE5_L : num [1:62] 0 0 0 0 0 0 0 0 0 0 ...
## $ PE5_V : num [1:62] 0 0 0 0 1 0 0 0 0 0 ...
## $ TPE_L : num [1:62] 0 3 4 3 3 0 0 0 0 0 ...
## $ TPE_V : num [1:62] 0 0 2 0 5 0 0 0 0 0 ...
## $ TOTAL_L : num [1:62] 2 3 5 3 3 1 1 1 1 1 ...
## $ TOTAL_V : num [1:62] 1 0 3 0 5 0 0 0 0 0 ...
## $ P_GOL_1 : Factor w/ 9 levels "1","2","3","4",..: 7 9 8 9 9 5 4 3 3
6 ...
## $ PRIM_GOL : Factor w/ 2 levels "local","visitante": 1 1 2 1 2 1 1 1
1 1 ...
## $ GANO : Factor w/ 2 levels "local","visitante": 1 1 1 1 2 1 1 1
1 1 ...
## $ GOL_GAN : num [1:62] 95 NA 117 NA NA 66 51 42 42 85 ...
## $ GOL_PERD : num [1:62] 114 NA 106 NA NA NA NA NA NA NA ...
#quitar partidos que terminaron el tiempo regular con empate 0-0---------
-----------------------------------------------
datos_goles <- datos_goles %>%
filter(!(TN_L == 0 & TN_V == 0))
# view(datos_goles)
#agregar variable nueva##################################################
##############
datos_goles <- datos_goles %>%
mutate(
TOTAL_GN=TN_L+TN_V)
#descriptiva#############################################################
###
#grafica periodo del primer gol segun quien anoto primero----------------
----------------------------------------
ggplot(datos_goles, aes(x = factor(P_GOL_1), fill = PRIM_GOL)) +
geom_bar(position = "fill") +
labs(
x = "Período en que se anoto el primer gol",
y = "Proporción",
title = "Proporción de primer gol segun quien lo anoto"
) +scale_fill_manual(
values = c("local" = "#342BA8", "visitante" = "#D93E1F")
)
#grafica periodo que anoto el primer gol segun equipo que lo anoto y gano
--------------------------------------------------------
win_anot <- filter(datos_goles, PRIM_GOL == GANO & PRIM_GOL %in% c("local
", "visitante"))
ggplot(win_anot, aes(x = factor(P_GOL_1), fill = GANO)) +
geom_bar(position = "fill") +
labs(
x = "Período (P_GOL_1)",
y = "Proporción",
title = "Proporción del periodo del primer gol segun quien gano"
) +scale_fill_manual(
values = c("local" = "#342BA8", "visitante" = "#D93E1F")
)
#porcentaje de anotar primero y ganar------------------------------------
--------------------
porcentaje_global_victorias_al_anotar_primero <- datos_goles %>%
filter(PRIM_GOL %in% c("local", "visitante") & !is.na(PRIM_GOL) & !is.n
a(GANO)) %>%
summarise(
porcentaje_global = mean(GANO == PRIM_GOL, na.rm = TRUE) * 100
)
print("Porcentaje global de victorias al marcar primero:")
## [1] "Porcentaje global de victorias al marcar primero:"
print(porcentaje_global_victorias_al_anotar_primero)
## # A tibble: 1 × 1
## porcentaje_global
## <dbl>
## 1 73.7
#porcentaje de veces q gano si anotaba primero dependiendo del equipo
porcentaje_win_anot <- datos_goles %>%
filter(PRIM_GOL %in% c("local", "visitante") & !is.na(PRIM_GOL)) %>%
group_by(PRIM_GOL) %>%
summarise(
partidos_totales = n(),
victorias = sum(GANO == PRIM_GOL, na.rm = TRUE),
porcentaje_win_anot_calc = (victorias / partidos_totales) * 100,
.groups = 'drop'
)
print("Porcentaje de victorias al marcar primero (Local vs Visitante):")
## [1] "Porcentaje de victorias al marcar primero (Local vs Visitante):"
print(porcentaje_win_anot)
## # A tibble: 2 × 4
## PRIM_GOL partidos_totales victorias porcentaje_win_anot_calc
## <fct> <int> <int> <dbl>
## 1 local 31 26 83.9
## 2 visitante 26 16 61.5
#grafico
if(nrow(porcentaje_win_anot) > 0){
ggplot(porcentaje_win_anot, aes(x = PRIM_GOL, y = porcentaje_win_anot_c
alc, fill = PRIM_GOL)) +
geom_col() +
geom_text(aes(label = paste0(round(porcentaje_win_anot_calc, 1), "%")
), vjust = -0.5) +
labs(
title = "Porcentaje de Victorias al Marcar Primero",
x = "Equipo que Anotó Primero",
y = "Porcentaje de Victorias (%)"
) +
theme_minimal()+scale_fill_manual(
values = c("local" = "#342BA8", "visitante" = "#D93E1F")
)
}
#distribucion cantidad de primeros goles por periodo---------------------
-----------------------------------
periodo_labels <- c("0-15", "15-30", "30-45", "45-60", "60-75", "75-90")
ggplot(datos_goles, aes(x = factor(P_GOL_1, levels = 1:6, labels = period
o_labels))) +
geom_histogram(stat = "count", fill = "#342BA8", color = "white") +
labs(
title = "Frecuencia del Primer Gol por Período",
x = "Período del Partido",
y = "Número de Partidos"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
## Warning in geom_histogram(stat = "count", fill = "#342BA8", color = "w
hite"):
## Ignoring unknown parameters: `binwidth`, `bins`, and `pad`
#cantidad de goles por periodo-------------------------------------------
-------------
goles_por_periodo_agregado <- datos_goles %>%
mutate(
goles_p1 = P1_L + P1_V,
goles_p2 = P2_L + P2_V,
goles_p3 = P3_L + P3_V,
goles_p4 = P4_L + P4_V,
goles_p5 = P5_L + P5_V,
goles_p6 = P6_L + P6_V
) %>%
select(starts_with("goles_p")) %>%
pivot_longer(
cols = everything(),
names_to = "periodo_txt",
values_to = "goles"
) %>%
mutate(
periodo_factor = factor(
periodo_txt,
levels = c("goles_p1", "goles_p2", "goles_p3", "goles_p4", "goles_p
5", "goles_p6", "goles_pr1", "goles_pr2"),
labels = c("0-15", "16-30", "31-45", "46-60", "61-75", "76-90", "Pr
ór. 1", "Prór. 2")
)
)
goles_porcentaje_periodo_agregado <- goles_por_periodo_agregado %>%
filter(!is.na(goles)) %>%
group_by(periodo_factor) %>%
summarise(total_goles_periodo = sum(goles, na.rm = TRUE), .groups = 'dr
op') %>%
mutate(
porcentaje = (total_goles_periodo / sum(total_goles_periodo, na.rm =
TRUE)) * 100,
etiqueta = sprintf("%.1f%%", porcentaje)
)
print("Porcentaje de goles marcados por período (Agregado):")
## [1] "Porcentaje de goles marcados por período (Agregado):"
# view(goles_porcentaje_periodo_agregado)
#
ggplot(goles_porcentaje_periodo_agregado, aes(x = periodo_factor, y = por
centaje)) +
geom_bar(stat = "identity", fill = "#342BA8", color = "white") +
geom_text(
aes(label = etiqueta),
vjust = -0.5,
size = 3
) +
labs(
title = "Porcentaje de Goles Totales Marcados por Período del Partido
",
x = "Período del Partido",
y = "Porcentaje de Goles (%)"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
#SHAPIRO#################################################################
########
T_mundial=datos_goles%>%filter(TORNEO=="MUNDIAL")
T_G_MUNDIAL=T_mundial$TOTAL_GN
T_eurocopa=datos_goles%>%filter(TORNEO=="EURO COPA")
T_G_EUROCOPA=T_eurocopa$TOTAL_GN
SHAP_MUNDIAL=shapiro.test(T_G_MUNDIAL)
print(SHAP_MUNDIAL)
##
## Shapiro-Wilk normality test
##
## data: T_G_MUNDIAL
## W = 0.86741, p-value = 0.001468
SHAP_EUROCOPA=shapiro.test(T_G_EUROCOPA)
print(SHAP_EUROCOPA)
##
## Shapiro-Wilk normality test
##
## data: T_G_EUROCOPA
## W = 0.82493, p-value = 0.000382
#mann whitney############################################################
#########
resultado_mannwhitney <- wilcox.test(TOTAL_GN ~ TORNEO,
data = datos_goles, # Para Mann-Whit
ney (independientes)
exact = FALSE) # aproxima el p_valor
por tantos empates
print(resultado_mannwhitney)
##
## Wilcoxon rank sum test with continuity correction
##
## data: TOTAL_GN by TORNEO
## W = 372, p-value = 0.587
## alternative hypothesis: true location shift is not equal to 0
medianas <- datos_goles %>%
group_by(TORNEO) %>%
summarise(Mediana_Goles = median(TOTAL_GN))
# view(medianas)
#gg plot --------------------------------------------------------
ggplot(datos_goles, aes(x = TORNEO, y = TOTAL_GN, fill = TORNEO)) +
geom_boxplot() +
scale_fill_manual(
values = c("MUNDIAL" = "#342BA8", "EURO COPA" = "#D93E1F"),
name = "Torneo" # Título de la leyenda
) +
labs(
title = "Distribución de goles por torneo",
x = "Torneo",
y = "Total de goles"
) +
theme_minimal()
#se ve una diferencia en el total de goles debido a q en el mundial el 26
% de sus datos son prorroga. penalties en cambio en eurocopa el 37% de su
s datos son prorroga o penalties haciendo q hayan mas partidos eque acaba
ron en el tiempo reglamentarion en el mundial habiendo mayor cantidad de
goles totales en los 90 minutos
#tabla 1################################################################
# --- PASO 1: Datos por Año ---------------------------------------------
--------------
data_by_year <- datos_goles %>%
group_by(TORNEO, YEAR) %>%
summarise(
val_Matches = n(),
val_Normal = sum(DURACION == "normal", na.rm = TRUE),
val_Prorroga = sum(DURACION == "prorroga", na.rm = TRUE),
val_Penalties = sum(DURACION == "penalties", na.rm = TRUE),
.groups = "drop"
) %>%
mutate(
Display_Column = as.character(YEAR),
Partidos = as.character(val_Matches),
`Partidos terminados en tiempo regular` = as.character(val_Normal),
`Partidos terminados en tiempo adicional` = as.character(val_Prorroga
),
`Partidos terminados en penalties` = as.character(val_Penalties)
) %>%
select(
TORNEO_Group = TORNEO,
Display_Column,
Partidos,
`Partidos terminados en tiempo regular`,
`Partidos terminados en tiempo adicional`,
`Partidos terminados en penalties`
)
# --- PASO 2: Totales por Torneo (con porcentajes) ----------------------
-------------------------------------
data_torneo_totals <- datos_goles %>%
group_by(TORNEO) %>%
summarise(
Num_Matches = n(),
Num_Normal = sum(DURACION == "normal", na.rm = TRUE),
Num_Prorroga = sum(DURACION == "prorroga", na.rm = TRUE),
Num_Penalties = sum(DURACION == "penalties", na.rm = TRUE),
.groups = "drop"
) %>%
mutate(
Display_Column = "Total",
Partidos = sprintf("%d (100.0%%)", Num_Matches),
`Partidos terminados en tiempo regular` = sprintf("%d (%.1f%%)", Num_
Normal, ifelse(Num_Matches == 0, 0, (Num_Normal / Num_Matches) * 100)),
`Partidos terminados en tiempo adicional` = sprintf("%d (%.1f%%)", Nu
m_Prorroga, ifelse(Num_Matches == 0, 0, (Num_Prorroga / Num_Matches) * 10
0)),
`Partidos terminados en penalties` = sprintf("%d (%.1f%%)", Num_Penal
ties, ifelse(Num_Matches == 0, 0, (Num_Penalties / Num_Matches) * 100))
) %>%
select(
TORNEO_Group = TORNEO,
Display_Column,
Partidos,
`Partidos terminados en tiempo regular`,
`Partidos terminados en tiempo adicional`,
`Partidos terminados en penalties`
)
# --- PASO 3: Gran Total (con porcentajes) ------------------------------
-----------------------------
data_grand_total <- datos_goles %>%
summarise(
Num_Matches = n(),
Num_Normal = sum(DURACION == "normal", na.rm = TRUE),
Num_Prorroga = sum(DURACION == "prorroga", na.rm = TRUE),
Num_Penalties = sum(DURACION == "penalties", na.rm = TRUE),
.groups = "drop"
) %>%
mutate(
TORNEO_Group = "Total",
Display_Column = "",
Partidos = sprintf("%d (100.0%%)", Num_Matches),
`Partidos terminados en tiempo regular` = sprintf("%d (%.1f%%)", Num_
Normal, ifelse(Num_Matches == 0, 0, (Num_Normal / Num_Matches) * 100)),
`Partidos terminados en tiempo adicional` = sprintf("%d (%.1f%%)", Nu
m_Prorroga, ifelse(Num_Matches == 0, 0, (Num_Prorroga / Num_Matches) * 10
0)),
`Partidos terminados en penalties` = sprintf("%d (%.1f%%)", Num_Penal
ties, ifelse(Num_Matches == 0, 0, (Num_Penalties / Num_Matches) * 100))
) %>%
select(
TORNEO_Group,
Display_Column,
Partidos,
`Partidos terminados en tiempo regular`,
`Partidos terminados en tiempo adicional`,
`Partidos terminados en penalties`
)
# --- PASO 4: Combinar todos los datos ----------------------------------
-------------------------
combined_data <- bind_rows(data_by_year, data_torneo_totals, data_grand_t
otal) %>%
mutate(
Order_TORNEO_Group = case_when(
TORNEO_Group == "MUNDIAL" ~ 1,
TORNEO_Group == "EURO COPA" ~ 2,
TORNEO_Group == "Total" ~ 3,
TRUE ~ 99
),
Order_Display_Column = ifelse(Display_Column == "Total", 2, 1)
) %>%
arrange(Order_TORNEO_Group, Order_Display_Column, Display_Column) %>%
mutate(
TORNEO_Group = case_when(
TORNEO_Group == "MUNDIAL" ~ "Mundial",
TORNEO_Group == "EURO COPA" ~ "Euro copa",
TRUE ~ TORNEO_Group
)
) %>%
select(-Order_TORNEO_Group, -Order_Display_Column)
# --- PASO 5: Crear la tabla con `gt` -----------------------------------
------------------------
final_table <- combined_data %>%
gt(groupname_col = "TORNEO_Group", rowname_col = "Display_Column") %>%
cols_label(Display_Column = "Year") %>%
tab_header(title = "Resumen de la duración de los partidos por torneo y
año") %>%
cols_align(
align = "right",
columns = c(Partidos, `Partidos terminados en tiempo regular`, `Parti
dos terminados en tiempo adicional`, `Partidos terminados en penalties`)
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_body(
columns = vars(Display_Column), # La columna que contiene "Año" o "
Total"
rows = Display_Column == "Total" # Condición para aplicar el estilo
)
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_body(
columns = vars(Display_Column),
rows = Display_Column == ""
)
)
## Warning: Since gt v0.3.0, `columns = vars(...)` has been deprecated.
## • Please use `columns = c(...)` instead.
## Warning: Since gt v0.3.0, `columns = vars(...)` has been deprecated.
## • Please use `columns = c(...)` instead.
# Mostrar la tabla
print(final_table)
## <div id="urcnejsbda" style="padding-left:0px;padding-right:0px;padding
-top:10px;padding-bottom:10px;overflow-x:auto;overflow-y:auto;width:auto;
height:auto;">
## <style>#urcnejsbda table {
## font-family: system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-s
erif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Col
or Emoji';
## -webkit-font-smoothing: antialiased;
## -moz-osx-font-smoothing: grayscale;
## }
##
## #urcnejsbda thead, #urcnejsbda tbody, #urcnejsbda tfoot, #urcnejsbda t
r, #urcnejsbda td, #urcnejsbda th {
## border-style: none;
## }
##
## #urcnejsbda p {
## margin: 0;
## padding: 0;
## }
##
## #urcnejsbda .gt_table {
## display: table;
## border-collapse: collapse;
## line-height: normal;
## margin-left: auto;
## margin-right: auto;
## color: #333333;
## font-size: 16px;
## font-weight: normal;
## font-style: normal;
## background-color: #FFFFFF;
## width: auto;
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #A8A8A8;
## border-right-style: none;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #A8A8A8;
## border-left-style: none;
## border-left-width: 2px;
## border-left-color: #D3D3D3;
## }
##
## #urcnejsbda .gt_caption {
## padding-top: 4px;
## padding-bottom: 4px;
## }
##
## #urcnejsbda .gt_title {
## color: #333333;
## font-size: 125%;
## font-weight: initial;
## padding-top: 4px;
## padding-bottom: 4px;
## padding-left: 5px;
## padding-right: 5px;
## border-bottom-color: #FFFFFF;
## border-bottom-width: 0;
## }
##
## #urcnejsbda .gt_subtitle {
## color: #333333;
## font-size: 85%;
## font-weight: initial;
## padding-top: 3px;
## padding-bottom: 5px;
## padding-left: 5px;
## padding-right: 5px;
## border-top-color: #FFFFFF;
## border-top-width: 0;
## }
##
## #urcnejsbda .gt_heading {
## background-color: #FFFFFF;
## text-align: center;
## border-bottom-color: #FFFFFF;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## }
##
## #urcnejsbda .gt_bottom_border {
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## }
##
## #urcnejsbda .gt_col_headings {
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## }
##
## #urcnejsbda .gt_col_heading {
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: normal;
## text-transform: inherit;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## vertical-align: bottom;
## padding-top: 5px;
## padding-bottom: 6px;
## padding-left: 5px;
## padding-right: 5px;
## overflow-x: hidden;
## }
##
## #urcnejsbda .gt_column_spanner_outer {
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: normal;
## text-transform: inherit;
## padding-top: 0;
## padding-bottom: 0;
## padding-left: 4px;
## padding-right: 4px;
## }
##
## #urcnejsbda .gt_column_spanner_outer:first-child {
## padding-left: 0;
## }
##
## #urcnejsbda .gt_column_spanner_outer:last-child {
## padding-right: 0;
## }
##
## #urcnejsbda .gt_column_spanner {
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## vertical-align: bottom;
## padding-top: 5px;
## padding-bottom: 5px;
## overflow-x: hidden;
## display: inline-block;
## width: 100%;
## }
##
## #urcnejsbda .gt_spanner_row {
## border-bottom-style: hidden;
## }
##
## #urcnejsbda .gt_group_heading {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: initial;
## text-transform: inherit;
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## vertical-align: middle;
## text-align: left;
## }
##
## #urcnejsbda .gt_empty_group_heading {
## padding: 0.5px;
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: initial;
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## vertical-align: middle;
## }
##
## #urcnejsbda .gt_from_md > :first-child {
## margin-top: 0;
## }
##
## #urcnejsbda .gt_from_md > :last-child {
## margin-bottom: 0;
## }
##
## #urcnejsbda .gt_row {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## margin: 10px;
## border-top-style: solid;
## border-top-width: 1px;
## border-top-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## vertical-align: middle;
## overflow-x: hidden;
## }
##
## #urcnejsbda .gt_stub {
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: initial;
## text-transform: inherit;
## border-right-style: solid;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #urcnejsbda .gt_stub_row_group {
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: initial;
## text-transform: inherit;
## border-right-style: solid;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## padding-left: 5px;
## padding-right: 5px;
## vertical-align: top;
## }
##
## #urcnejsbda .gt_row_group_first td {
## border-top-width: 2px;
## }
##
## #urcnejsbda .gt_row_group_first th {
## border-top-width: 2px;
## }
##
## #urcnejsbda .gt_summary_row {
## color: #333333;
## background-color: #FFFFFF;
## text-transform: inherit;
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #urcnejsbda .gt_first_summary_row {
## border-top-style: solid;
## border-top-color: #D3D3D3;
## }
##
## #urcnejsbda .gt_first_summary_row.thick {
## border-top-width: 2px;
## }
##
## #urcnejsbda .gt_last_summary_row {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## }
##
## #urcnejsbda .gt_grand_summary_row {
## color: #333333;
## background-color: #FFFFFF;
## text-transform: inherit;
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #urcnejsbda .gt_first_grand_summary_row {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## border-top-style: double;
## border-top-width: 6px;
## border-top-color: #D3D3D3;
## }
##
## #urcnejsbda .gt_last_grand_summary_row_top {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## border-bottom-style: double;
## border-bottom-width: 6px;
## border-bottom-color: #D3D3D3;
## }
##
## #urcnejsbda .gt_striped {
## background-color: rgba(128, 128, 128, 0.05);
## }
##
## #urcnejsbda .gt_table_body {
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## }
##
## #urcnejsbda .gt_footnotes {
## color: #333333;
## background-color: #FFFFFF;
## border-bottom-style: none;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 2px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## }
##
## #urcnejsbda .gt_footnote {
## margin: 0px;
## font-size: 90%;
## padding-top: 4px;
## padding-bottom: 4px;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #urcnejsbda .gt_sourcenotes {
## color: #333333;
## background-color: #FFFFFF;
## border-bottom-style: none;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 2px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## }
##
## #urcnejsbda .gt_sourcenote {
## font-size: 90%;
## padding-top: 4px;
## padding-bottom: 4px;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #urcnejsbda .gt_left {
## text-align: left;
## }
##
## #urcnejsbda .gt_center {
## text-align: center;
## }
##
## #urcnejsbda .gt_right {
## text-align: right;
## font-variant-numeric: tabular-nums;
## }
##
## #urcnejsbda .gt_font_normal {
## font-weight: normal;
## }
##
## #urcnejsbda .gt_font_bold {
## font-weight: bold;
## }
##
## #urcnejsbda .gt_font_italic {
## font-style: italic;
## }
##
## #urcnejsbda .gt_super {
## font-size: 65%;
## }
##
## #urcnejsbda .gt_footnote_marks {
## font-size: 75%;
## vertical-align: 0.4em;
## position: initial;
## }
##
## #urcnejsbda .gt_asterisk {
## font-size: 100%;
## vertical-align: 0;
## }
##
## #urcnejsbda .gt_indent_1 {
## text-indent: 5px;
## }
##
## #urcnejsbda .gt_indent_2 {
## text-indent: 10px;
## }
##
## #urcnejsbda .gt_indent_3 {
## text-indent: 15px;
## }
##
## #urcnejsbda .gt_indent_4 {
## text-indent: 20px;
## }
##
## #urcnejsbda .gt_indent_5 {
## text-indent: 25px;
## }
##
## #urcnejsbda .katex-display {
## display: inline-flex !important;
## margin-bottom: 0.75em !important;
## }
##
## #urcnejsbda div.Reactable > div.rt-table > div.rt-thead > div.rt-tr.rt
-tr-group-header > div.rt-th-group:after {
## height: 0px !important;
## }
## </style>
## <table class="gt_table" data-quarto-disable-processing="false" data-
quarto-bootstrap="false">
## <thead>
## <tr class="gt_heading">
## <td colspan="5" class="gt_heading gt_title gt_font_normal gt_bot
tom_border" style>Resumen de la duración de los partidos por torneo y año
</td>
## </tr>
##
## <tr class="gt_col_headings">
## <th class="gt_col_heading gt_columns_bottom_border gt_left" rows
pan="1" colspan="1" scope="col" id="a::stub"></th>
## <th class="gt_col_heading gt_columns_bottom_border gt_right" row
span="1" colspan="1" scope="col" id="Partidos">Partidos</th>
## <th class="gt_col_heading gt_columns_bottom_border gt_right" row
span="1" colspan="1" scope="col" id="Partidos-terminados-en-tiempo-regula
r">Partidos terminados en tiempo regular</th>
## <th class="gt_col_heading gt_columns_bottom_border gt_right" row
span="1" colspan="1" scope="col" id="Partidos-terminados-en-tiempo-adicio
nal">Partidos terminados en tiempo adicional</th>
## <th class="gt_col_heading gt_columns_bottom_border gt_right" row
span="1" colspan="1" scope="col" id="Partidos-terminados-en-penalties">Pa
rtidos terminados en penalties</th>
## </tr>
## </thead>
## <tbody class="gt_table_body">
## <tr class="gt_group_heading_row">
## <th colspan="5" class="gt_group_heading" scope="colgroup" id="Mu
ndial">Mundial</th>
## </tr>
## <tr class="gt_row_group_first"><th id="stub_1_1" scope="row" class
="gt_row gt_left gt_stub">2018</th>
## <td headers="Mundial stub_1_1 Partidos" class="gt_row gt_right">16</td
>
## <td headers="Mundial stub_1_1 Partidos terminados en tiempo regular" c
lass="gt_row gt_right">11</td>
## <td headers="Mundial stub_1_1 Partidos terminados en tiempo adicional"
class="gt_row gt_right">1</td>
## <td headers="Mundial stub_1_1 Partidos terminados en penalties" class=
"gt_row gt_right">4</td></tr>
## <tr><th id="stub_1_2" scope="row" class="gt_row gt_left gt_stub">2
022</th>
## <td headers="Mundial stub_1_2 Partidos" class="gt_row gt_right">14</td
>
## <td headers="Mundial stub_1_2 Partidos terminados en tiempo regular" c
lass="gt_row gt_right">11</td>
## <td headers="Mundial stub_1_2 Partidos terminados en tiempo adicional"
class="gt_row gt_right">0</td>
## <td headers="Mundial stub_1_2 Partidos terminados en penalties" class=
"gt_row gt_right">3</td></tr>
## <tr><th id="stub_1_3" scope="row" class="gt_row gt_left gt_stub">T
otal</th>
## <td headers="Mundial stub_1_3 Partidos" class="gt_row gt_right">30 (10
0.0%)</td>
## <td headers="Mundial stub_1_3 Partidos terminados en tiempo regular" c
lass="gt_row gt_right">22 (73.3%)</td>
## <td headers="Mundial stub_1_3 Partidos terminados en tiempo adicional"
class="gt_row gt_right">1 (3.3%)</td>
## <td headers="Mundial stub_1_3 Partidos terminados en penalties" class=
"gt_row gt_right">7 (23.3%)</td></tr>
## <tr class="gt_group_heading_row">
## <th colspan="5" class="gt_group_heading" scope="colgroup" id="Eu
ro copa">Euro copa</th>
## </tr>
## <tr class="gt_row_group_first"><th id="stub_1_4" scope="row" class
="gt_row gt_left gt_stub">2020</th>
## <td headers="Euro copa stub_1_4 Partidos" class="gt_row gt_right">14</
td>
## <td headers="Euro copa stub_1_4 Partidos terminados en tiempo regular"
class="gt_row gt_right">7</td>
## <td headers="Euro copa stub_1_4 Partidos terminados en tiempo adiciona
l" class="gt_row gt_right">3</td>
## <td headers="Euro copa stub_1_4 Partidos terminados en penalties" clas
s="gt_row gt_right">4</td></tr>
## <tr><th id="stub_1_5" scope="row" class="gt_row gt_left gt_stub">2
024</th>
## <td headers="Euro copa stub_1_5 Partidos" class="gt_row gt_right">13</
td>
## <td headers="Euro copa stub_1_5 Partidos terminados en tiempo regular"
class="gt_row gt_right">10</td>
## <td headers="Euro copa stub_1_5 Partidos terminados en tiempo adiciona
l" class="gt_row gt_right">2</td>
## <td headers="Euro copa stub_1_5 Partidos terminados en penalties" clas
s="gt_row gt_right">1</td></tr>
## <tr><th id="stub_1_6" scope="row" class="gt_row gt_left gt_stub">T
otal</th>
## <td headers="Euro copa stub_1_6 Partidos" class="gt_row gt_right">27 (
100.0%)</td>
## <td headers="Euro copa stub_1_6 Partidos terminados en tiempo regular"
class="gt_row gt_right">17 (63.0%)</td>
## <td headers="Euro copa stub_1_6 Partidos terminados en tiempo adiciona
l" class="gt_row gt_right">5 (18.5%)</td>
## <td headers="Euro copa stub_1_6 Partidos terminados en penalties" clas
s="gt_row gt_right">5 (18.5%)</td></tr>
## <tr class="gt_group_heading_row">
## <th colspan="5" class="gt_group_heading" scope="colgroup" id="To
tal">Total</th>
## </tr>
## <tr class="gt_row_group_first"><th id="stub_1_7" scope="row" class
="gt_row gt_left gt_stub"></th>
## <td headers="Total stub_1_7 Partidos" class="gt_row gt_right">57 (100.
0%)</td>
## <td headers="Total stub_1_7 Partidos terminados en tiempo regular" cla
ss="gt_row gt_right">39 (68.4%)</td>
## <td headers="Total stub_1_7 Partidos terminados en tiempo adicional" c
lass="gt_row gt_right">6 (10.5%)</td>
## <td headers="Total stub_1_7 Partidos terminados en penalties" class="g
t_row gt_right">12 (21.1%)</td></tr>
## </tbody>
##
##
## </table>
## </div>
#tabla 2################################################################
# Paso 1: Calcular estadísticas por TORNEO y DURACION--------------------
------------------------------------
stats_por_torneo <- datos_goles %>%
filter(PRIM_GOL %in% c("local", "visitante")) %>%
mutate(primero_marco_y_gano = (PRIM_GOL == GANO & !is.na(GANO))) %>%
group_by(TORNEO, DURACION) %>%
summarise(
total_partidos_con_primer_gol = n(),
partidos_ganados_por_quien_marco_primero = sum(primero_marco_y_gano,
na.rm = TRUE),
.groups = 'drop'
) %>%
mutate(
porcentaje_victoria_marcando_primero = ifelse(total_partidos_con_prim
er_gol == 0, 0,
(partidos_ganados_por_q
uien_marco_primero / total_partidos_con_primer_gol) * 100)
)
# Paso 2: Calcular estadísticas para el TOTAL GENERAL (Ambas Competicione
s)--------------------------------------------------------
stats_total_general <- datos_goles %>%
filter(PRIM_GOL %in% c("local", "visitante")) %>%
mutate(primero_marco_y_gano = (PRIM_GOL == GANO & !is.na(GANO))) %>%
group_by(DURACION) %>%
summarise(
total_partidos_con_primer_gol = n(),
partidos_ganados_por_quien_marco_primero = sum(primero_marco_y_gano,
na.rm = TRUE),
.groups = 'drop'
) %>%
mutate(
porcentaje_victoria_marcando_primero = ifelse(total_partidos_con_prim
er_gol == 0, 0,
(partidos_ganados_por_q
uien_marco_primero / total_partidos_con_primer_gol) * 100),
TORNEO = "Total"
)
all_percentages_data <- bind_rows(
stats_por_torneo %>% select(TORNEO, DURACION, porcentaje_victoria_marca
ndo_primero),
stats_total_general %>% select(TORNEO, DURACION, porcentaje_victoria_ma
rcando_primero)
) %>%
rename(percentage = porcentaje_victoria_marcando_primero)
# --- PASO 3 (REVISADO): Pivotar los datos a formato ancho --------------
---------------------------------------------
tabla_datos_ancha <- all_percentages_data %>%
mutate(
Competición = case_when(
TORNEO == "MUNDIAL" ~ "Mundial", #Modificado para que coincida con
el print de tabla3
TORNEO == "EURO COPA" ~ "Euro copa",
TORNEO == "Total" ~ "Total",
TRUE ~ as.character(TORNEO)
),
`Condición_Duracion` = case_when(
DURACION == "normal" ~ "Efecto de marcar primero en el tiempo regla
mentario",
DURACION == "prorroga" ~ "Efecto de marcar primero en el tiempo Aña
dido",
DURACION == "penalties" ~ "Efecto de marcar primero en los penaltis
",
TRUE ~ as.character(DURACION)
)
) %>%
select(Competición, `Condición_Duracion`, percentage) %>%
pivot_wider(names_from = `Condición_Duracion`, values_from = percentage
) %>%
mutate(
Competición_Order = case_when(
Competición == "Mundial" ~ 1,
Competición == "Euro copa" ~ 2,
Competición == "Total" ~ 3,
TRUE ~ 4
)
) %>%
arrange(Competición_Order) %>%
select(-Competición_Order)
# --- PASO 4 (REVISADO): Crear la tabla gt con el formato ancho ---------
--------------------------------------------------
tabla_gt_ancha_final <- tabla_datos_ancha %>%
gt() %>%
cols_label(
Competición = md("**Competición**"),
`Efecto de marcar primero en el tiempo reglamentario` = md("**Efecto
de marcar primero en el tiempo reglamentario**"),
`Efecto de marcar primero en el tiempo Añadido` = md("**Efecto de mar
car primero en el tiempo Añadido**"),
`Efecto de marcar primero en los penaltis` = md("**Efecto de marcar p
rimero en los penaltis**")
) %>%
fmt_number(
columns = c("Efecto de marcar primero en el tiempo reglamentario", "E
fecto de marcar primero en el tiempo Añadido", "Efecto de marcar primero
en los penaltis"),
decimals = 2,
pattern = "{x}%"
) %>%
tab_header(
title = md("**Tabla 2: Efecto de Marcar Primero en Ganar el Partido**
"),
subtitle = md("Porcentaje de victorias del equipo que marcó primero,
según duración del partido.")
) %>%
tab_spanner(
label = md("**% de Victorias al Marcar Primero**"),
columns = c("Efecto de marcar primero en el tiempo reglamentario", "E
fecto de marcar primero en el tiempo Añadido", "Efecto de marcar primero
en los penaltis")
) %>%
cols_align(
align = "center",
columns = c("Efecto de marcar primero en el tiempo reglamentario", "E
fecto de marcar primero en el tiempo Añadido", "Efecto de marcar primero
en los penaltis")
) %>%
cols_align(
align = "left",
columns = vars(Competición)
) %>%
opt_table_lines("default")
## Warning: Since gt v0.3.0, `columns = vars(...)` has been deprecated.
## • Please use `columns = c(...)` instead.
print(tabla_gt_ancha_final)
## <div id="cmsktbmhyl" style="padding-left:0px;padding-right:0px;padding
-top:10px;padding-bottom:10px;overflow-x:auto;overflow-y:auto;width:auto;
height:auto;">
## <style>#cmsktbmhyl table {
## font-family: system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-s
erif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Col
or Emoji';
## -webkit-font-smoothing: antialiased;
## -moz-osx-font-smoothing: grayscale;
## }
##
## #cmsktbmhyl thead, #cmsktbmhyl tbody, #cmsktbmhyl tfoot, #cmsktbmhyl t
r, #cmsktbmhyl td, #cmsktbmhyl th {
## border-style: none;
## }
##
## #cmsktbmhyl p {
## margin: 0;
## padding: 0;
## }
##
## #cmsktbmhyl .gt_table {
## display: table;
## border-collapse: collapse;
## line-height: normal;
## margin-left: auto;
## margin-right: auto;
## color: #333333;
## font-size: 16px;
## font-weight: normal;
## font-style: normal;
## background-color: #FFFFFF;
## width: auto;
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #A8A8A8;
## border-right-style: none;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #A8A8A8;
## border-left-style: none;
## border-left-width: 2px;
## border-left-color: #D3D3D3;
## }
##
## #cmsktbmhyl .gt_caption {
## padding-top: 4px;
## padding-bottom: 4px;
## }
##
## #cmsktbmhyl .gt_title {
## color: #333333;
## font-size: 125%;
## font-weight: initial;
## padding-top: 4px;
## padding-bottom: 4px;
## padding-left: 5px;
## padding-right: 5px;
## border-bottom-color: #FFFFFF;
## border-bottom-width: 0;
## }
##
## #cmsktbmhyl .gt_subtitle {
## color: #333333;
## font-size: 85%;
## font-weight: initial;
## padding-top: 3px;
## padding-bottom: 5px;
## padding-left: 5px;
## padding-right: 5px;
## border-top-color: #FFFFFF;
## border-top-width: 0;
## }
##
## #cmsktbmhyl .gt_heading {
## background-color: #FFFFFF;
## text-align: center;
## border-bottom-color: #FFFFFF;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## }
##
## #cmsktbmhyl .gt_bottom_border {
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## }
##
## #cmsktbmhyl .gt_col_headings {
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## }
##
## #cmsktbmhyl .gt_col_heading {
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: normal;
## text-transform: inherit;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## vertical-align: bottom;
## padding-top: 5px;
## padding-bottom: 6px;
## padding-left: 5px;
## padding-right: 5px;
## overflow-x: hidden;
## }
##
## #cmsktbmhyl .gt_column_spanner_outer {
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: normal;
## text-transform: inherit;
## padding-top: 0;
## padding-bottom: 0;
## padding-left: 4px;
## padding-right: 4px;
## }
##
## #cmsktbmhyl .gt_column_spanner_outer:first-child {
## padding-left: 0;
## }
##
## #cmsktbmhyl .gt_column_spanner_outer:last-child {
## padding-right: 0;
## }
##
## #cmsktbmhyl .gt_column_spanner {
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## vertical-align: bottom;
## padding-top: 5px;
## padding-bottom: 5px;
## overflow-x: hidden;
## display: inline-block;
## width: 100%;
## }
##
## #cmsktbmhyl .gt_spanner_row {
## border-bottom-style: hidden;
## }
##
## #cmsktbmhyl .gt_group_heading {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: initial;
## text-transform: inherit;
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## vertical-align: middle;
## text-align: left;
## }
##
## #cmsktbmhyl .gt_empty_group_heading {
## padding: 0.5px;
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: initial;
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## vertical-align: middle;
## }
##
## #cmsktbmhyl .gt_from_md > :first-child {
## margin-top: 0;
## }
##
## #cmsktbmhyl .gt_from_md > :last-child {
## margin-bottom: 0;
## }
##
## #cmsktbmhyl .gt_row {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## margin: 10px;
## border-top-style: solid;
## border-top-width: 1px;
## border-top-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## vertical-align: middle;
## overflow-x: hidden;
## }
##
## #cmsktbmhyl .gt_stub {
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: initial;
## text-transform: inherit;
## border-right-style: solid;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #cmsktbmhyl .gt_stub_row_group {
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: initial;
## text-transform: inherit;
## border-right-style: solid;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## padding-left: 5px;
## padding-right: 5px;
## vertical-align: top;
## }
##
## #cmsktbmhyl .gt_row_group_first td {
## border-top-width: 2px;
## }
##
## #cmsktbmhyl .gt_row_group_first th {
## border-top-width: 2px;
## }
##
## #cmsktbmhyl .gt_summary_row {
## color: #333333;
## background-color: #FFFFFF;
## text-transform: inherit;
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #cmsktbmhyl .gt_first_summary_row {
## border-top-style: solid;
## border-top-color: #D3D3D3;
## }
##
## #cmsktbmhyl .gt_first_summary_row.thick {
## border-top-width: 2px;
## }
##
## #cmsktbmhyl .gt_last_summary_row {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## }
##
## #cmsktbmhyl .gt_grand_summary_row {
## color: #333333;
## background-color: #FFFFFF;
## text-transform: inherit;
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #cmsktbmhyl .gt_first_grand_summary_row {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## border-top-style: double;
## border-top-width: 6px;
## border-top-color: #D3D3D3;
## }
##
## #cmsktbmhyl .gt_last_grand_summary_row_top {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## border-bottom-style: double;
## border-bottom-width: 6px;
## border-bottom-color: #D3D3D3;
## }
##
## #cmsktbmhyl .gt_striped {
## background-color: rgba(128, 128, 128, 0.05);
## }
##
## #cmsktbmhyl .gt_table_body {
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## }
##
## #cmsktbmhyl .gt_footnotes {
## color: #333333;
## background-color: #FFFFFF;
## border-bottom-style: none;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 2px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## }
##
## #cmsktbmhyl .gt_footnote {
## margin: 0px;
## font-size: 90%;
## padding-top: 4px;
## padding-bottom: 4px;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #cmsktbmhyl .gt_sourcenotes {
## color: #333333;
## background-color: #FFFFFF;
## border-bottom-style: none;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 2px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## }
##
## #cmsktbmhyl .gt_sourcenote {
## font-size: 90%;
## padding-top: 4px;
## padding-bottom: 4px;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #cmsktbmhyl .gt_left {
## text-align: left;
## }
##
## #cmsktbmhyl .gt_center {
## text-align: center;
## }
##
## #cmsktbmhyl .gt_right {
## text-align: right;
## font-variant-numeric: tabular-nums;
## }
##
## #cmsktbmhyl .gt_font_normal {
## font-weight: normal;
## }
##
## #cmsktbmhyl .gt_font_bold {
## font-weight: bold;
## }
##
## #cmsktbmhyl .gt_font_italic {
## font-style: italic;
## }
##
## #cmsktbmhyl .gt_super {
## font-size: 65%;
## }
##
## #cmsktbmhyl .gt_footnote_marks {
## font-size: 75%;
## vertical-align: 0.4em;
## position: initial;
## }
##
## #cmsktbmhyl .gt_asterisk {
## font-size: 100%;
## vertical-align: 0;
## }
##
## #cmsktbmhyl .gt_indent_1 {
## text-indent: 5px;
## }
##
## #cmsktbmhyl .gt_indent_2 {
## text-indent: 10px;
## }
##
## #cmsktbmhyl .gt_indent_3 {
## text-indent: 15px;
## }
##
## #cmsktbmhyl .gt_indent_4 {
## text-indent: 20px;
## }
##
## #cmsktbmhyl .gt_indent_5 {
## text-indent: 25px;
## }
##
## #cmsktbmhyl .katex-display {
## display: inline-flex !important;
## margin-bottom: 0.75em !important;
## }
##
## #cmsktbmhyl div.Reactable > div.rt-table > div.rt-thead > div.rt-tr.rt
-tr-group-header > div.rt-th-group:after {
## height: 0px !important;
## }
## </style>
## <table class="gt_table" data-quarto-disable-processing="false" data-
quarto-bootstrap="false">
## <thead>
## <tr class="gt_heading">
## <td colspan="4" class="gt_heading gt_title gt_font_normal" style
><span class='gt_from_md'><strong>Tabla 2: Efecto de Marcar Primero en Ga
nar el Partido</strong></span></td>
## </tr>
## <tr class="gt_heading">
## <td colspan="4" class="gt_heading gt_subtitle gt_font_normal gt_
bottom_border" style><span class='gt_from_md'>Porcentaje de victorias del
equipo que marcó primero, según duración del partido.</span></td>
## </tr>
## <tr class="gt_col_headings gt_spanner_row">
## <th class="gt_col_heading gt_columns_bottom_border gt_left" rows
pan="2" colspan="1" scope="col" id="Competición"><span class='gt_from_md'
><strong>Competición</strong></span></th>
## <th class="gt_center gt_columns_top_border gt_column_spanner_out
er" rowspan="1" colspan="3" scope="colgroup" id="**% de Victorias al Marc
ar Primero**">
## <div class="gt_column_spanner"><span class='gt_from_md'><stron
g>% de Victorias al Marcar Primero</strong></span></div>
## </th>
## </tr>
## <tr class="gt_col_headings">
## <th class="gt_col_heading gt_columns_bottom_border gt_center" ro
wspan="1" colspan="1" scope="col" id="Efecto-de-marcar-primero-en-el-tiem
po-reglamentario"><span class='gt_from_md'><strong>Efecto de marcar prime
ro en el tiempo reglamentario</strong></span></th>
## <th class="gt_col_heading gt_columns_bottom_border gt_center" ro
wspan="1" colspan="1" scope="col" id="Efecto-de-marcar-primero-en-el-tiem
po-Añadido"><span class='gt_from_md'><strong>Efecto de marcar primero en
el tiempo Añadido</strong></span></th>
## <th class="gt_col_heading gt_columns_bottom_border gt_center" ro
wspan="1" colspan="1" scope="col" id="Efecto-de-marcar-primero-en-los-pen
altis"><span class='gt_from_md'><strong>Efecto de marcar primero en los p
enaltis</strong></span></th>
## </tr>
## </thead>
## <tbody class="gt_table_body">
## <tr><td headers="Competición" class="gt_row gt_left">Mundial</td>
## <td headers="Efecto de marcar primero en el tiempo reglamentario" clas
s="gt_row gt_center">95.45%</td>
## <td headers="Efecto de marcar primero en el tiempo Añadido" class="gt_
row gt_center">0.00%</td>
## <td headers="Efecto de marcar primero en los penaltis" class="gt_row g
t_center">42.86%</td></tr>
## <tr><td headers="Competición" class="gt_row gt_left">Euro copa</td
>
## <td headers="Efecto de marcar primero en el tiempo reglamentario" clas
s="gt_row gt_center">76.47%</td>
## <td headers="Efecto de marcar primero en el tiempo Añadido" class="gt_
row gt_center">40.00%</td>
## <td headers="Efecto de marcar primero en los penaltis" class="gt_row g
t_center">60.00%</td></tr>
## <tr><td headers="Competición" class="gt_row gt_left">Total</td>
## <td headers="Efecto de marcar primero en el tiempo reglamentario" clas
s="gt_row gt_center">87.18%</td>
## <td headers="Efecto de marcar primero en el tiempo Añadido" class="gt_
row gt_center">33.33%</td>
## <td headers="Efecto de marcar primero en los penaltis" class="gt_row g
t_center">50.00%</td></tr>
## </tbody>
##
##
## </table>
## </div>
#nuevas variables########################################################
########
datos_goles=datos_goles%>%mutate(
goles_p1 = P1_L + P1_V,
goles_p2 = P2_L + P2_V,
goles_p3 = P3_L + P3_V,
goles_p4 = P4_L + P4_V,
goles_p5 = P5_L + P5_V,
goles_p6 = P6_L + P6_V)
#tabla 3 por pasitos ####################################################
############
#efecto de marcar primero y ganar----------------------------------------
----------------
datos_goles_con_efecto <- datos_goles %>%
mutate(
PRIM_GOL = as.character(PRIM_GOL),
GANO = as.character(GANO),
marco_primero_y_gano_partido = case_when(
is.na(PRIM_GOL) | PRIM_GOL == "" |
is.na(GANO) | GANO == "" | GANO == "Empate" | GANO == "EMPATE" ~
FALSE,
PRIM_GOL == GANO ~
TRUE,
TRUE ~
FALSE
)
)
# --- MODIFICACIÓN AL PASO 2 de tu código -------------------------------
----------------------------
efecto_anual_counts <- datos_goles_con_efecto %>%
filter(!is.na(PRIM_GOL) & PRIM_GOL != "") %>%
group_by(TORNEO, YEAR) %>%
summarise(
partidos_con_primer_gol_valido = n(),
victorias_marcando_primero = sum(marco_primero_y_gano_partido, na.rm
= TRUE),
.groups = 'drop'
) %>%
mutate(
PORC_MARCAR_PRIMERO_GANAR = ifelse(partidos_con_primer_gol_valido > 0
,
(victorias_marcando_primero / part
idos_con_primer_gol_valido) * 100,
0)
)
lista_resultados_fisher <- list()
# 1. Comparación Mundiales (2018 vs. 2022) con Prueba Exacta de Fisher###
#############################################################
mundial_2018_stats_fisher <- efecto_anual_counts %>%
filter(TORNEO == "MUNDIAL" & YEAR == 2018)
mundial_2022_stats_fisher <- efecto_anual_counts %>%
filter(TORNEO == "MUNDIAL" & YEAR == 2022)
if(nrow(mundial_2018_stats_fisher) == 1 && nrow(mundial_2022_stats_fisher
) == 1) {
k_mundial_2018 <- mundial_2018_stats_fisher$victorias_marcando_primero
n_mundial_2018 <- mundial_2018_stats_fisher$partidos_con_primer_gol_val
ido
fracasos_mundial_2018 <- n_mundial_2018 - k_mundial_2018
k_mundial_2022 <- mundial_2022_stats_fisher$victorias_marcando_primero
n_mundial_2022 <- mundial_2022_stats_fisher$partidos_con_primer_gol_val
ido
fracasos_mundial_2022 <- n_mundial_2022 - k_mundial_2022
tabla_contingencia_mundial <- matrix(
c(k_mundial_2018, fracasos_mundial_2018,
k_mundial_2022, fracasos_mundial_2022),
nrow = 2, byrow = FALSE,
dimnames = list(
Resultado = c("MarcóPrimero_y_Ganó", "MarcóPrimero_y_NO_Ganó"),
Año_Mundial = c("2018", "2022")
)
)
test_fisher_mundial <- fisher.test(tabla_contingencia_mundial)
print(test_fisher_mundial)
# Extraer y guardar los resultados-------------------------------------
-------------------
prop_mundial_2018 <- ifelse(n_mundial_2018 > 0, (k_mundial_2018 / n_mun
dial_2018) * 100, 0)
prop_mundial_2022 <- ifelse(n_mundial_2022 > 0, (k_mundial_2022 / n_mun
dial_2022) * 100, 0)
resultados_mundial <- data.frame(
Comparacion = "Mundial: 2018 vs 2022",
Torneo_Base = "MUNDIAL",
Año1 = 2018,
Prop_Año1_Porc = prop_mundial_2018,
Exitos_Año1 = k_mundial_2018,
Total_Año1 = n_mundial_2018,
Año2 = 2022,
Prop_Año2_Porc = prop_mundial_2022,
Exitos_Año2 = k_mundial_2022,
Total_Año2 = n_mundial_2022,
Odds_Ratio = as.numeric(test_fisher_mundial$estimate),
OR_CI_Lower = test_fisher_mundial$conf.int[1],
OR_CI_Upper = test_fisher_mundial$conf.int[2],
P_Valor = test_fisher_mundial$p.value
)
lista_resultados_fisher[["Mundial_2018_vs_2022"]] <- resultados_mundial
} else {
print("Error: No se pudieron obtener datos para la comparación de Mundi
ales.")
}
##
## Fisher's Exact Test for Count Data
##
## data: tabla_contingencia_mundial
## p-value = 0.1755
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 0.003333534 1.952382646
## sample estimates:
## odds ratio
## 0.1787131
# 2. Comparación Eurocopas (2020 vs. 2024) con Prueba Exacta de Fisher---
-----------------------------------------------------
euro_2020_stats_fisher <- efecto_anual_counts %>%
filter(TORNEO == "EURO COPA" & YEAR == 2020)
euro_2024_stats_fisher <- efecto_anual_counts %>%
filter(TORNEO == "EURO COPA" & YEAR == 2024)
if(nrow(euro_2020_stats_fisher) == 1 && nrow(euro_2024_stats_fisher) == 1
) {
k_euro_2020 <- euro_2020_stats_fisher$victorias_marcando_primero
n_euro_2020 <- euro_2020_stats_fisher$partidos_con_primer_gol_valido
fracasos_euro_2020 <- n_euro_2020 - k_euro_2020
k_euro_2024 <- euro_2024_stats_fisher$victorias_marcando_primero
n_euro_2024 <- euro_2024_stats_fisher$partidos_con_primer_gol_valido
fracasos_euro_2024 <- n_euro_2024 - k_euro_2024
tabla_contingencia_euro <- matrix(
c(k_euro_2020, fracasos_euro_2020,
k_euro_2024, fracasos_euro_2024),
nrow = 2, byrow = FALSE,
dimnames = list(
Resultado = c("MarcóPrimero_y_Ganó", "MarcóPrimero_y_NO_Ganó"),
Año_Eurocopa = c("2020", "2024")
)
)
test_fisher_euro <- fisher.test(tabla_contingencia_euro)
# Extraer y guardar los resultados-------------------------------------
-------------------
prop_euro_2020 <- ifelse(n_euro_2020 > 0, (k_euro_2020 / n_euro_2020) *
100, 0)
prop_euro_2024 <- ifelse(n_euro_2024 > 0, (k_euro_2024 / n_euro_2024) *
100, 0)
resultados_euro <- data.frame(
Comparacion = "Eurocopa: 2020 vs 2024",
Torneo_Base = "EURO COPA",
Año1 = 2020,
Prop_Año1_Porc = prop_euro_2020,
Exitos_Año1 = k_euro_2020,
Total_Año1 = n_euro_2020,
Año2 = 2024,
Prop_Año2_Porc = prop_euro_2024,
Exitos_Año2 = k_euro_2024,
Total_Año2 = n_euro_2024,
Odds_Ratio = as.numeric(test_fisher_euro$estimate),
OR_CI_Lower = test_fisher_euro$conf.int[1],
OR_CI_Upper = test_fisher_euro$conf.int[2],
P_Valor = test_fisher_euro$p.value
)
lista_resultados_fisher[["Euro_2020_vs_2024"]] <- resultados_euro
} else {
print("Error: No se pudieron obtener datos para la comparación de Euroc
opas.")
}
# Combinar todos los resultados en una sola tabla------------------------
--------------------------------
if (length(lista_resultados_fisher) > 0) {
tabla_final_fisher <- dplyr::bind_rows(lista_resultados_fisher)
print("Tabla Final con Resultados de Fisher:")
print(tabla_final_fisher)
} else {
print("No se generaron resultados para la tabla final.")
}
## [1] "Tabla Final con Resultados de Fisher:"
## Comparacion Torneo_Base Año1 Prop_Año1_Porc Exitos_Año1 T
otal_Año1
## 1 Mundial: 2018 vs 2022 MUNDIAL 2018 68.75000 11
16
## 2 Eurocopa: 2020 vs 2024 EURO COPA 2020 78.57143 11
14
## Año2 Prop_Año2_Porc Exitos_Año2 Total_Año2 Odds_Ratio OR_CI_Lower OR
_CI_Upper
## 1 2022 92.85714 13 14 0.1787131 0.003333534
1.952383
## 2 2024 53.84615 7 13 3.0070555 0.455284868
25.049960
## P_Valor
## 1 0.1754789
## 2 0.2364607
# view(tabla_final_fisher)
# view(tabla_final_fisher%>%select(Comparacion,Prop_Año1_Porc,Total_Año1,
Prop_Año2_Porc,Total_Año2,Odds_Ratio, P_Valor))
#datos para el resto de la tabla 3#######################################
#########################
data=datos_goles%>%select(TORNEO,YEAR,TOTAL_GN,goles_p1,goles_p2,goles_p3
,goles_p4,goles_p5,goles_p6,GOL_GAN,GOL_PERD)
#normalidad variables por fecha------------------------------------------
--------------
# 1. Definir las variables numéricas que quieres testear
variables_numericas_a_testear <- c("TOTAL_GN", "goles_p1", "goles_p2", "g
oles_p3",
"goles_p4", "goles_p5", "goles_p6",
"GOL_GAN", "GOL_PERD")
# 2. Crear una función auxiliar para ejecutar Shapiro-Wilk y devolver un
data frame/tibble--------------------------------------------------------
ejecutar_shapiro_wilk <- function(valores_columna) {
valores_limpios <- valores_columna[!is.na(valores_columna)]
if (length(valores_limpios) >= 3 && length(valores_limpios) <= 5000) {
test_resultado <- shapiro.test(valores_limpios)
return(
tibble(
N_Observaciones = length(valores_limpios),
W_Statistic = test_resultado$statistic,
P_Value = test_resultado$p.value
)
)
} else if (length(valores_limpios) > 5000) {
return(
tibble(
N_Observaciones = length(valores_limpios),
W_Statistic = NA_real_,
P_Value = NA_real_
)
)
} else {
return(
tibble(
N_Observaciones = length(valores_limpios),
W_Statistic = NA_real_,
P_Value = NA_real_
)
)
}
}
# 3. Remodelar los datos a formato largo (long format)-------------------
-------------------------------------
data_formato_largo <- data %>%
select(TORNEO, YEAR, all_of(variables_numericas_a_testear)) %>%
pivot_longer(
cols = all_of(variables_numericas_a_testear),
names_to = "Variable_Testeada",
values_to = "Valor_Observado"
)
# 4. Agrupar por TORNEO, YEAR y Variable_Testeada, y aplicar la prueba de
normalidad--------------------------------------------------------
resultados_normalidad <- data_formato_largo %>%
group_by(TORNEO, YEAR, Variable_Testeada) %>%
summarise(
resultados_shapiro = list(ejecutar_shapiro_wilk(Valor_Observado)),
.groups = 'drop'
) %>%
unnest(resultados_shapiro)
print(resultados_normalidad)
## # A tibble: 36 × 6
## TORNEO YEAR Variable_Testeada N_Observaciones W_Statistic P_V
alue
## <fct> <dbl> <chr> <int> <dbl> <
dbl>
## 1 EURO COPA 2020 GOL_GAN 14 0.931 0.312
## 2 EURO COPA 2020 GOL_PERD 9 0.987 0.990
## 3 EURO COPA 2020 TOTAL_GN 14 0.809 0.006
46
## 4 EURO COPA 2020 goles_p1 14 0.616 0.000
0565
## 5 EURO COPA 2020 goles_p2 14 0.576 0.000
0250
## 6 EURO COPA 2020 goles_p3 14 0.679 0.000
225
## 7 EURO COPA 2020 goles_p4 14 0.735 0.000
878
## 8 EURO COPA 2020 goles_p5 14 0.576 0.000
0250
## 9 EURO COPA 2020 goles_p6 14 0.740 0.000
984
## 10 EURO COPA 2024 GOL_GAN 13 0.955 0.680
## # 26 more rows
# view(resultados_normalidad)
resultados_evaluacion_normalidad <- resultados_normalidad %>%
mutate(
Evaluacion_Normalidad = ifelse(
is.na(P_Value),
"No se pudo determinar (datos insuficientes o N > 5000 para Shapiro
)",
ifelse(
P_Value >= 0.05,
"Presenta Normalidad (p >= 0.05)",
"No Presenta Normalidad (p < 0.05)"
)
)
)
print(resultados_evaluacion_normalidad)
## # A tibble: 36 × 7
## TORNEO YEAR Variable_Testeada N_Observaciones W_Statistic P_V
alue
## <fct> <dbl> <chr> <int> <dbl> <
dbl>
## 1 EURO COPA 2020 GOL_GAN 14 0.931 0.312
## 2 EURO COPA 2020 GOL_PERD 9 0.987 0.990
## 3 EURO COPA 2020 TOTAL_GN 14 0.809 0.006
46
## 4 EURO COPA 2020 goles_p1 14 0.616 0.000
0565
## 5 EURO COPA 2020 goles_p2 14 0.576 0.000
0250
## 6 EURO COPA 2020 goles_p3 14 0.679 0.000
225
## 7 EURO COPA 2020 goles_p4 14 0.735 0.000
878
## 8 EURO COPA 2020 goles_p5 14 0.576 0.000
0250
## 9 EURO COPA 2020 goles_p6 14 0.740 0.000
984
## 10 EURO COPA 2024 GOL_GAN 13 0.955 0.680
## # 26 more rows
## # 1 more variable: Evaluacion_Normalidad <chr>
# view(resultados_evaluacion_normalidad)
#QQ plot para confirmar normalidad#######################################
#########################
cat("\n--- Generando Gráficos Q-Q para Casos Específicos ---\n")
##
## --- Generando Gráficos Q-Q para Casos Específicos ---
# 1. Define las combinaciones específicas para las que quieres los gráfic
os Q-Q--------------------------------------------------------
combinaciones_qq <- tribble(
~TORNEO_str, ~YEAR_num, ~Variable_str,
"EURO COPA", 2020, "GOL_GAN",
"EURO COPA", 2020, "GOL_PERD",
"EURO COPA", 2024, "GOL_GAN",
"EURO COPA", 2024, "GOL_PERD",
"MUNDIAL", 2018, "GOL_GAN",
"MUNDIAL", 2018, "GOL_PERD",
"MUNDIAL", 2022, "GOL_GAN",
"MUNDIAL", 2022, "GOL_PERD",
"MUNDIAL", 2022, "TOTAL_GN"
)
# 2. Unir con los resultados de Shapiro para obtener P_Value y N_Observac
iones--------------------------------------------------------
if (exists("resultados_normalidad") && nrow(resultados_normalidad) > 0) {
combinaciones_qq_con_stats <- combinaciones_qq %>%
mutate(
TORNEO = factor(TORNEO_str, levels = levels(resultados_normalidad$T
ORNEO)),
YEAR = as.double(YEAR_num),
Variable_Testeada = Variable_str
) %>%
left_join(resultados_normalidad, by = c("TORNEO", "YEAR", "Variable_T
esteada")) %>%
filter(!is.na(P_Value))
if (nrow(combinaciones_qq_con_stats) == 0) {
print("No se encontraron resultados de Shapiro-Wilk para las combinac
iones especificadas. Verifica los nombres y años.")
} else {
# 3. Iterar sobre estas combinaciones y generar los gráficos---------
-----------------------------------------------
for (i in 1:nrow(combinaciones_qq_con_stats)) {
fila_actual_qq <- combinaciones_qq_con_stats[i, ]
nombre_torneo_qq <- fila_actual_qq$TORNEO
año_qq <- fila_actual_qq$YEAR
variable_qq <- fila_actual_qq$Variable_Testeada
shapiro_p_val_qq <- fila_actual_qq$P_Value
shapiro_n_obs_qq <- fila_actual_qq$N_Observaciones
datos_para_grafico_qq <- data_formato_largo %>%
filter(
TORNEO == nombre_torneo_qq,
YEAR ==o_qq,
Variable_Testeada == variable_qq
) %>%
pull(Valor_Observado) %>%
na.omit()
if (length(datos_para_grafico_qq) < 3) {
print(paste("Saltando Q-Q plot para:", variable_qq, "en", nombre_
torneo_qq, año_qq,
"- Datos insuficientes después de quitar NAs:", lengt
h(datos_para_grafico_qq)))
next
}
titulo_grafico_qq <- paste("Gráfico Q-Q para:", variable_qq,
"\nTorneo:", nombre_torneo_qq, "- Año:",
año_qq,
"\n(Shapiro P-Valor:", round(shapiro_p_v
al_qq, 4), ", N Efectivo:", shapiro_n_obs_qq, ")")
df_para_plot_qq <- data.frame(Valores = datos_para_grafico_qq)
grafico_qq_actual <- ggplot(df_para_plot_qq, aes(sample = Valores))
+
geom_qq(color = "#342BA8", shape = 16, alpha = 0.7) +
geom_qq_line(color = "#D93E1F", linewidth = 1) +
labs(
title = titulo_grafico_qq,
x = "Cuantiles Teóricos (Normal)",
y = "Cuantiles de la Muestra"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 10))
print(grafico_qq_actual)
}
}
} else {
print("El dataframe 'resultados_normalidad' no existe o está vacío. Ase
gúrate de haber corrido las pruebas de normalidad primero.")
}
#pruebas de homocedasticidad#############################################
###################
# 3. Define los pares de años a comparar para cada torneo----------------
----------------------------------------
comparaciones_por_torneo <- list(
MUNDIAL = list(años = c(2018, 2022), etiqueta_comp = "Mundial: 2018 vs
2022"),
`EURO COPA` = list(años = c(2020, 2024), etiqueta_comp = "Eurocopa: 202
0 vs 2024")
)
# 4. Inicializar un tibble para guardar los resultados
resultados_levene_pares_años <- tibble()
# 5. Bucle a través de los torneos, luego las variables
for (nombre_torneo_loop in names(comparaciones_por_torneo)) {
info_comparacion_loop <- comparaciones_por_torneo[[nombre_torneo_loop]]
años_a_comparar_loop <- info_comparacion_loop$años
etiqueta_comparacion_loop <- info_comparacion_loop$etiqueta_comp
if (length(años_a_comparar_loop) != 2) {
print(paste("Saltando comparación:", etiqueta_comparacion_loop, "- se
necesitan exactamente dos años."))
next
}
for (nombre_variable_loop in variables_numericas_a_testear) {
datos_filtrados_levene <- data %>%
filter(
TORNEO == nombre_torneo_loop,
YEAR %in% años_a_comparar_loop
) %>%
select(YEAR, Valor = all_of(nombre_variable_loop)) %>%
mutate(YEAR = as.factor(YEAR)) %>%
drop_na(Valor)
stats_por_año_levene <- datos_filtrados_levene %>%
group_by(YEAR) %>%
summarise(
n_obs = n(),
varianza = var(Valor, na.rm = TRUE)
) %>%
ungroup()
n_original_año1_levene <- nrow(filter(data, TORNEO == nombre_torneo_l
oop & YEAR == años_a_comparar_loop[1]))
n_original_año2_levene <- nrow(filter(data, TORNEO == nombre_torneo_l
oop & YEAR == años_a_comparar_loop[2]))
stats_año1_levene <- stats_por_año_levene %>% filter(YEAR == as.chara
cter(años_a_comparar_loop[1]))
stats_año2_levene <- stats_por_año_levene %>% filter(YEAR == as.chara
cter(años_a_comparar_loop[2]))
f_stat_val_levene <- NA_real_
p_val_val_levene <- NA_real_
nota_val_levene <- ""
if (nrow(stats_año1_levene) == 0 || nrow(stats_año2_levene) == 0 ||
stats_año1_levene$n_obs < 2 || stats_año2_levene$n_obs < 2) {
nota_val_levene <- "Datos insuficientes (n<2 en al menos un grupo d
espués de quitar NAs para esta variable)."
} else {
var1_levene <- stats_año1_levene$varianza
var2_levene <- stats_año2_levene$varianza
if (is.na(var1_levene) || is.na(var2_levene)) {
nota_val_levene <- "Varianza no calculable (n<2 o todos NAs) en u
no o ambos grupos."
} else if (var1_levene == 0 && var2_levene == 0) {
p_val_val_levene <- 1.0
nota_val_levene <- "Ambos grupos tienen varianza cero (homocedást
icos)."
} else if (var1_levene == 0 || var2_levene == 0) {
p_val_val_levene <- 0.00000001
nota_val_levene <- "Un grupo tiene varianza cero y el otro no (he
terocedásticos)."
} else {
resultado_test_obj_levene <- tryCatch({
leveneTest(Valor ~ YEAR, data = datos_filtrados_levene, center
= median)
}, error = function(e) {
return(list(error_message = as.character(e$message)))
})
if (!is.null(resultado_test_obj_levene) && is.null(resultado_test
_obj_levene$error_message)) {
f_stat_val_levene <- resultado_test_obj_levene$`F value`[1]
p_val_val_levene <- resultado_test_obj_levene$`Pr(>F)`[1]
} else if (!is.null(resultado_test_obj_levene$error_message)) {
nota_val_levene <- paste("Error en LeveneTest:", resultado_test
_obj_levene$error_message)
} else {
nota_val_levene <- "Error desconocido en LeveneTest."
}
}
}
temp_resultado_levene <- tibble(
Comparacion = etiqueta_comparacion_loop,
Variable_Testeada = nombre_variable_loop,
Año1 = años_a_comparar_loop[1],
N_Total_Año1 = n_original_año1_levene,
N_Efectivo_Año1 = ifelse(nrow(stats_año1_levene) == 0, 0, stats_año
1_levene$n_obs),
Año2 = años_a_comparar_loop[2],
N_Total_Año2 = n_original_año2_levene,
N_Efectivo_Año2 = ifelse(nrow(stats_año2_levene) == 0, 0, stats_año
2_levene$n_obs),
F_Statistic_Levene = f_stat_val_levene,
P_Value_Levene = p_val_val_levene,
Nota_Levene = nota_val_levene
)
resultados_levene_pares_años <- bind_rows(resultados_levene_pares_año
s, temp_resultado_levene)
}
}
# 6. Ver los resultados y añadir conclusión de homocedasticidad
print("Resultados de la Prueba de Levene para pares de años:")
## [1] "Resultados de la Prueba de Levene para pares de años:"
print(resultados_levene_pares_años)
## # A tibble: 18 × 11
## Comparacion Variable_Testeada Año1 N_Total_Año1 N_Efectivo_
Año1 Año2
## <chr> <chr> <dbl> <int> <
int> <dbl>
## 1 Mundial: 2018 vs … TOTAL_GN 2018 16
16 2022
## 2 Mundial: 2018 vs … goles_p1 2018 16
16 2022
## 3 Mundial: 2018 vs … goles_p2 2018 16
16 2022
## 4 Mundial: 2018 vs … goles_p3 2018 16
16 2022
## 5 Mundial: 2018 vs … goles_p4 2018 16
16 2022
## 6 Mundial: 2018 vs … goles_p5 2018 16
16 2022
## 7 Mundial: 2018 vs … goles_p6 2018 16
16 2022
## 8 Mundial: 2018 vs … GOL_GAN 2018 16
16 2022
## 9 Mundial: 2018 vs … GOL_PERD 2018 16
10 2022
## 10 Eurocopa: 2020 vs… TOTAL_GN 2020 14
14 2024
## 11 Eurocopa: 2020 vs… goles_p1 2020 14
14 2024
## 12 Eurocopa: 2020 vs… goles_p2 2020 14
14 2024
## 13 Eurocopa: 2020 vs… goles_p3 2020 14
14 2024
## 14 Eurocopa: 2020 vs… goles_p4 2020 14
14 2024
## 15 Eurocopa: 2020 vs… goles_p5 2020 14
14 2024
## 16 Eurocopa: 2020 vs… goles_p6 2020 14
14 2024
## 17 Eurocopa: 2020 vs… GOL_GAN 2020 14
14 2024
## 18 Eurocopa: 2020 vs… GOL_PERD 2020 14
9 2024
## # 5 more variables: N_Total_Año2 <int>, N_Efectivo_Año2 <int>,
## # F_Statistic_Levene <dbl>, P_Value_Levene <dbl>, Nota_Levene <chr>
# view(resultados_levene_pares_años)
resultados_levene_con_conclusion <- resultados_levene_pares_años %>%
mutate(
Conclusion_Homocedasticidad = case_when(
grepl("varianza cero", Nota_Levene, ignore.case = TRUE) ~ Nota_Leve
ne,
grepl("Error en LeveneTest", Nota_Levene, ignore.case = TRUE) ~ pas
te("No se pudo determinar:", Nota_Levene),
grepl("Datos insuficientes", Nota_Levene, ignore.case = TRUE) ~ pas
te("No se pudo determinar:", Nota_Levene),
is.na(P_Value_Levene) & Nota_Levene == "" ~ "P_Value NA sin nota",
is.na(P_Value_Levene) ~ Nota_Levene,
P_Value_Levene >= 0.05 ~ "Homocedasticidad (p >= 0.05)",
P_Value_Levene < 0.05 ~ "Heterocedasticidad (p < 0.05)",
TRUE ~ "Revisar caso"
)
)
print("Resultados de Levene con Conclusión:")
## [1] "Resultados de Levene con Conclusión:"
print(resultados_levene_con_conclusion %>%
select(Comparacion, Variable_Testeada, N_Efectivo_Año1, N_Efectiv
o_Año2, P_Value_Levene, Conclusion_Homocedasticidad, Nota_Levene))
## # A tibble: 18 × 7
## Comparacion Variable_Testeada N_Efectivo_Año1 N_Efectivo_Año2 P_Va
lue_Levene
## <chr> <chr> <int> <int>
<dbl>
## 1 Mundial: 20… TOTAL_GN 16 14
1
## 2 Mundial: 20… goles_p1 16 14
0.780
## 3 Mundial: 20… goles_p2 16 14
0.603
## 4 Mundial: 20… goles_p3 16 14
0.465
## 5 Mundial: 20… goles_p4 16 14
0.594
## 6 Mundial: 20… goles_p5 16 14
0.178
## 7 Mundial: 20… goles_p6 16 14
0.153
## 8 Mundial: 20… GOL_GAN 16 14
0.147
## 9 Mundial: 20… GOL_PERD 10 10
0.436
## 10 Eurocopa: 2… TOTAL_GN 14 13
0.405
## 11 Eurocopa: 2… goles_p1 14 13
0.492
## 12 Eurocopa: 2… goles_p2 14 13
0.430
## 13 Eurocopa: 2… goles_p3 14 13
0.209
## 14 Eurocopa: 2… goles_p4 14 13
0.666
## 15 Eurocopa: 2… goles_p5 14 13
0.364
## 16 Eurocopa: 2… goles_p6 14 13
0.191
## 17 Eurocopa: 2… GOL_GAN 14 13
0.579
## 18 Eurocopa: 2… GOL_PERD 9 9
0.216
## # 2 more variables: Conclusion_Homocedasticidad <chr>, Nota_Levene <
chr>
# view(resultados_levene_con_conclusion)
# view(resultados_levene_con_conclusion%>%select(Comparacion,Variable_Tes
teada,N_Efectivo_Año1,N_Total_Año1,N_Efectivo_Año2,N_Total_Año2,F_Statist
ic_Levene,P_Value_Levene,Conclusion_Homocedasticidad))
#mann_whitney############################################################
####
# 3. Inicializar un tibble para guardar los resultados de Mann-Whitney
resultados_mann_whitney <- tibble()
# 4. Bucle a través de los torneos, luego las variables
for (nombre_torneo_mw in names(comparaciones_por_torneo)) {
info_comp_mw <- comparaciones_por_torneo[[nombre_torneo_mw]]
años_comp_mw <- info_comp_mw$años
etiqueta_comp_mw <- info_comp_mw$etiqueta_comp
if (length(años_comp_mw) != 2) {
print(paste("Saltando Mann-Whitney para", etiqueta_comp_mw, "- se nec
esitan exactamente dos años."))
next
}
for (nombre_variable_mw in variables_numericas_a_testear) {
datos_filtrados_mw <- data %>%
filter(
TORNEO == nombre_torneo_mw,
YEAR %in% años_comp_mw
) %>%
select(YEAR, Valor = all_of(nombre_variable_mw)) %>%
mutate(YEAR_factor = as.factor(YEAR)) %>%
drop_na(Valor)
stats_por_año_mw <- datos_filtrados_mw %>%
group_by(YEAR_factor) %>%
summarise(
n_obs = n(),
mediana_valor = median(Valor, na.rm = TRUE)
) %>%
ungroup()
stats_año1_mw <- stats_por_año_mw %>% filter(YEAR_factor == as.charac
ter(años_comp_mw[1]))
stats_año2_mw <- stats_por_año_mw %>% filter(YEAR_factor == as.charac
ter(años_comp_mw[2]))
n_efectivo_año1 <- ifelse(nrow(stats_año1_mw) > 0, stats_año1_mw$n_ob
s, 0)
mediana_año1 <- ifelse(nrow(stats_año1_mw) > 0, stats_año1_mw$mediana
_valor, NA_real_)
n_efectivo_año2 <- ifelse(nrow(stats_año2_mw) > 0, stats_año2_mw$n_ob
s, 0)
mediana_año2 <- ifelse(nrow(stats_año2_mw) > 0, stats_año2_mw$mediana
_valor, NA_real_)
w_stat_mw <- NA_real_
p_val_mw <- NA_real_
nota_mw <- ""
if (n_efectivo_año1 < 1 || n_efectivo_año2 < 1) {
nota_mw <- "Datos insuficientes (n<1 en al menos un grupo después d
e quitar NAs) para Mann-Whitney."
} else {
resultado_test_obj_mw <- tryCatch({
wilcox.test(Valor ~ YEAR_factor, data = datos_filtrados_mw,
exact = FALSE,
conf.int = FALSE,
paired = FALSE)
}, error = function(e) {
return(list(error_message = as.character(e$message)))
})
if (!is.null(resultado_test_obj_mw) && is.null(resultado_test_obj_m
w$error_message)) {
w_stat_mw <- resultado_test_obj_mw$statistic # Estadístico W de W
ilcoxon
p_val_mw <- resultado_test_obj_mw$p.value
} else if (!is.null(resultado_test_obj_mw$error_message)) {
nota_mw <- paste("Error en Mann-Whitney:", resultado_test_obj_mw$
error_message)
} else {
nota_mw <- "Error desconocido en Mann-Whitney."
}
}
temp_resultado_mw <- tibble(
Comparacion = etiqueta_comp_mw,
Variable_Testeada = nombre_variable_mw,
Año1 = años_comp_mw[1],
N_Efectivo_Año1 = n_efectivo_año1,
Mediana_Año1 = mediana_año1,
Año2 = años_comp_mw[2],
N_Efectivo_Año2 = n_efectivo_año2,
Mediana_Año2 = mediana_año2,
W_Statistic_MW = w_stat_mw,
P_Value_MW = p_val_mw,
Nota_MW = nota_mw
)
resultados_mann_whitney <- bind_rows(resultados_mann_whitney, temp_re
sultado_mw)
}
}
# 5. Ver los resultados
print("Resultados de las Pruebas U de Mann-Whitney para pares de años:")
## [1] "Resultados de las Pruebas U de Mann-Whitney para pares de años:"
# View(resultados_mann_whitney)
resultados_mann_whitney_con_conclusion <- resultados_mann_whitney %>%
mutate(
Conclusion_MW = case_when(
!is.na(Nota_MW) & Nota_MW != "" ~ paste("No se pudo determinar:", N
ota_MW),
is.na(P_Value_MW) ~ "P_Value NA sin nota específica",
P_Value_MW < 0.05 ~ "Diferencia significativa (p < 0.05)",
P_Value_MW >= 0.05 ~ "No diferencia significativa (p >= 0.05)",
TRUE ~ "Revisar caso"
)
)
print("Resultados de Mann-Whitney con Conclusión:")
## [1] "Resultados de Mann-Whitney con Conclusión:"
# View(resultados_mann_whitney_con_conclusion %>%
# select(Comparacion, Variable_Testeada, N_Efectivo_Año1, Mediana_
Año1, N_Efectivo_Año2, Mediana_Año2, P_Value_MW, Conclusion_MW))
#datos descriptivos para armar la tabla##################################
##############################
data_long_para_medianas <- data %>%
pivot_longer(
cols = all_of(variables_numericas_a_testear),
names_to = "Variable_Analizada",
values_to = "Valor"
) %>%
drop_na(Valor)
# Paso 2: Calcular medianas y N para los años individuales especificados
en 'comparaciones_por_torneo'
lista_años_individuales <- unlist(lapply(comparaciones_por_torneo, functi
on(x) x$años))
medianas_años_individuales <- data_long_para_medianas %>%
filter(
(TORNEO == "MUNDIAL" & YEAR %in% comparaciones_por_torneo$MUNDIAL$o
s) |
(TORNEO == "EURO COPA" & YEAR %in% comparaciones_por_torneo$`EURO C
OPA`$años)
) %>%
group_by(TORNEO, YEAR, Variable_Analizada) %>%
summarise(
Mediana = median(Valor, na.rm = TRUE),
N_Obs = n(),
.groups = 'drop'
) %>%
mutate(Grupo_Descriptor = as.character(YEAR))
# Paso 3: Calcular medianas y N para el "Total" de los años combinados po
r torneo
lista_medianas_totales_torneo <- list()
for (torneo_actual in names(comparaciones_por_torneo)) {
años_del_torneo_actual <- comparaciones_por_torneo[[torneo_actual]]$año
s
etiqueta_total_actual <- paste0("Total ", torneo_actual, " (",
paste(años_del_torneo_actual, collapse
= "+"), ")")
# Ej: "Total MUNDIAL (2018+2022)"
medianas_temp_total <- data_long_para_medianas %>%
filter(TORNEO == torneo_actual, YEAR %in% años_del_torneo_actual) %>%
group_by(TORNEO, Variable_Analizada) %>%
summarise(
Mediana = median(Valor, na.rm = TRUE),
N_Obs = n(),
.groups = 'drop'
) %>%
mutate(
YEAR = NA_real_,
Grupo_Descriptor = etiqueta_total_actual
)
lista_medianas_totales_torneo[[torneo_actual]] <- medianas_temp_total
}
# Combinar los dataframes de la lista en uno solo
medianas_totales_por_torneo_df <- bind_rows(lista_medianas_totales_torneo
)
medianas_totales_por_torneo_df <- medianas_totales_por_torneo_df %>%
select(TORNEO, YEAR, Variable_Analizada, Mediana, N_Obs, Grupo_Descript
or)
tabla_descriptivos_medianas <- bind_rows(
medianas_años_individuales,
medianas_totales_por_torneo_df
) %>%
arrange(Variable_Analizada, TORNEO, Grupo_Descriptor)
# Ver los resultados de los descriptivos calculados
print("Descriptivos Calculados (Medianas y N):")
## [1] "Descriptivos Calculados (Medianas y N):"
# View(tabla_descriptivos_medianas)
#ahora si tabla 3########################################################
########
definicion_columnas_tabla3 <- tribble(
~Variable_Interna, ~Encabezado_GT,
~Tipo_Descriptivo, ~Order,
"PORC_MARCAR_PRIMERO_GANAR", "Efecto marcar primero equipo ganador (
%)", "porcentaje", 1,
"TOTAL_GN", "Goles totales por partido (Mediana (N)
)", "mediana", 2,
"goles_p1", "Goles periodo 0-15 min (Mediana (N))",
"mediana", 3,
"goles_p2", "Goles periodo 16-30 min (Mediana (N))"
, "mediana", 4,
"goles_p3", "Goles periodo 31-45 min (Mediana (N))"
, "mediana", 5,
"goles_p4", "Goles periodo 46-60 min (Mediana (N))"
, "mediana", 6,
"goles_p5", "Goles periodo 61-75 min (Mediana (N))"
, "mediana", 7,
"goles_p6", "Goles periodo 76-90 min (Mediana (N))"
, "mediana", 8,
"GOL_GAN", "Minuto primer gol equipo ganador (Medi
ana (N))", "mediana", 9,
"GOL_PERD", "Minuto primer gol equipo perdedor (Med
iana (N))", "mediana", 10
) %>% arrange(Order)
# Crear nombres de columna seguros para el dataframe intermedio (antes de
gt)
definicion_columnas_tabla3 <- definicion_columnas_tabla3 %>%
mutate(Nombre_Col_df = make.names(Encabezado_GT))
#########
# Función para formatear Mediana (N)
formatear_mediana_N <- function(mediana, n_obs) {
if (length(mediana) != 1 || length(n_obs) != 1 ||
!is.numeric(mediana) || !is.numeric(n_obs)) {
return("-")
}
if (is.na(mediana) || is.na(n_obs) || n_obs == 0) {
return("-")
}
paste0(sprintf("%.2f", mediana), " (N=", n_obs, ")")
}
formatear_porcentaje_N <- function(porcentaje, n_obs) {
if (length(porcentaje) != 1 || length(n_obs) != 1 ||
!is.numeric(porcentaje) || !is.numeric(n_obs)) {
return("-")
}
if (is.na(porcentaje) || is.na(n_obs) || n_obs == 0) {
return("-")
}
paste0(sprintf("%.1f%%", porcentaje), " (N=", n_obs, ")")
}
formatear_MW <- function(W_stat, p_val) {
if (length(W_stat) != 1 || length(p_val) != 1 || !is.numeric(W_stat) ||
!is.numeric(p_val)) {
return("-")
}
if (is.na(W_stat) || is.na(p_val)) return("-")
p_val_formateado <- format.pval(p_val, digits = 2, eps = 0.001)
estrellas_sig <- case_when(p_val < 0.001 ~ "***", p_val < 0.01 ~ "**",
p_val < 0.05 ~ "*", TRUE ~ "")
paste0(round(W_stat, 0), estrellas_sig, " (p=", p_val_formateado, ")")
}
formatear_Fisher <- function(OR, OR_CI_L, OR_CI_U, p_val) {
if (length(OR) != 1 || length(OR_CI_L) != 1 || length(OR_CI_U) != 1 ||
length(p_val) != 1 ||
!is.numeric(OR) || !is.numeric(OR_CI_L) || !is.numeric(OR_CI_U) ||
!is.numeric(p_val)) {
return("-")
}
if (is.na(OR) || is.na(p_val)) return("-")
p_val_formateado <- format.pval(p_val, digits = 2, eps = 0.001)
estrellas_sig <- case_when(p_val < 0.001 ~ "***", p_val < 0.01 ~ "**",
p_val < 0.05 ~ "*", TRUE ~ "")
or_texto <- paste0(sprintf("%.2f", OR), " [", sprintf("%.2f", OR_CI_L),
"-", sprintf("%.2f", OR_CI_U), "]")
paste0(or_texto, estrellas_sig, " (p=", p_val_formateado, ")")
}
#########
filas_para_tabla_gt <- list()
años_mundial <- comparaciones_por_torneo$MUNDIAL$años
años_euro <- comparaciones_por_torneo$`EURO COPA`$años
# --- SECCIÓN MUNDIAL ---
torneo_actual_label <- "Mundial"
torneo_actual_data <- "MUNDIAL"
años_actuales <- años_mundial
etiqueta_comparacion_actual <- comparaciones_por_torneo$MUNDIAL$etiqueta_
comp
fila_mundial_año1 <- tibble(GT_Torneo_Grupo = torneo_actual_label, GT_Eti
queta_Fila = as.character(años_actuales[1]))
for(j in 1:nrow(definicion_columnas_tabla3)){
var_int <- definicion_columnas_tabla3$Variable_Interna[j]
col_df_name <- definicion_columnas_tabla3$Nombre_Col_df[j]
tipo_desc <- definicion_columnas_tabla3$Tipo_Descriptivo[j]
if(tipo_desc == "porcentaje"){
datos_fisher_m <- tabla_final_fisher %>% filter(Torneo_Base == torneo
_actual_data, Comparacion == etiqueta_comparacion_actual)
valor_display <- formatear_porcentaje_N(datos_fisher_m$Prop_Año1_Porc
, datos_fisher_m$Total_Año1)
} else {
datos_desc_m <- tabla_descriptivos_medianas %>%
filter(TORNEO == torneo_actual_data, YEAR == años_actuales[1], Vari
able_Analizada == var_int)
valor_display <- formatear_mediana_N(datos_desc_m$Mediana, datos_desc
_m$N_Obs)
}
fila_mundial_año1[[col_df_name]] <- valor_display
}
filas_para_tabla_gt <- append(filas_para_tabla_gt, list(fila_mundial_año1
))
fila_mundial_año2 <- tibble(GT_Torneo_Grupo = torneo_actual_label, GT_Eti
queta_Fila = as.character(años_actuales[2]))
for(j in 1:nrow(definicion_columnas_tabla3)){
var_int <- definicion_columnas_tabla3$Variable_Interna[j]
col_df_name <- definicion_columnas_tabla3$Nombre_Col_df[j]
tipo_desc <- definicion_columnas_tabla3$Tipo_Descriptivo[j]
if(tipo_desc == "porcentaje"){
datos_fisher_m <- tabla_final_fisher %>% filter(Torneo_Base == torneo
_actual_data, Comparacion == etiqueta_comparacion_actual)
valor_display <- formatear_porcentaje_N(datos_fisher_m$Prop_Año2_Porc
, datos_fisher_m$Total_Año2)
} else {
datos_desc_m <- tabla_descriptivos_medianas %>%
filter(TORNEO == torneo_actual_data, YEAR == años_actuales[2], Vari
able_Analizada == var_int)
valor_display <- formatear_mediana_N(datos_desc_m$Mediana, datos_desc
_m$N_Obs)
}
fila_mundial_año2[[col_df_name]] <- valor_display
}
filas_para_tabla_gt <- append(filas_para_tabla_gt, list(fila_mundial_año2
))
# Fila para Mundial - Total
fila_mundial_total <- tibble(GT_Torneo_Grupo = torneo_actual_label, GT_Et
iqueta_Fila = "Total")
for(j in 1:nrow(definicion_columnas_tabla3)){
var_int <- definicion_columnas_tabla3$Variable_Interna[j]
col_df_name <- definicion_columnas_tabla3$Nombre_Col_df[j]
tipo_desc <- definicion_columnas_tabla3$Tipo_Descriptivo[j]
if(tipo_desc == "porcentaje"){
total_efecto_stats <- efecto_anual_counts %>%
filter(TORNEO == torneo_actual_data, YEAR %in% años_actuales) %>%
summarise(sum_victorias = sum(victorias_marcando_primero, na.rm = T
RUE),
sum_partidos = sum(partidos_con_primer_gol_valido, na.rm
= TRUE)) %>%
mutate(PORC_Total = ifelse(sum_partidos > 0, (sum_victorias / sum_p
artidos) * 100, 0),
N_Total = sum_partidos)
valor_display <- formatear_porcentaje_N(total_efecto_stats$PORC_Total
, total_efecto_stats$N_Total)
} else {
descriptor_total_actual = paste0("Total ", torneo_actual_data, " (",
paste(años_actuales, collapse = "+"), ")")
datos_desc_m <- tabla_descriptivos_medianas %>%
filter(TORNEO == torneo_actual_data, Grupo_Descriptor == descriptor
_total_actual, Variable_Analizada == var_int)
valor_display <- formatear_mediana_N(datos_desc_m$Mediana, datos_desc
_m$N_Obs)
}
fila_mundial_total[[col_df_name]] <- valor_display
}
filas_para_tabla_gt <- append(filas_para_tabla_gt, list(fila_mundial_tota
l))
fila_mundial_test <- tibble(GT_Torneo_Grupo = torneo_actual_label, GT_Eti
queta_Fila = "Mann-Whitney U / Fisher (p-valor)")
for(j in 1:nrow(definicion_columnas_tabla3)){
var_int <- definicion_columnas_tabla3$Variable_Interna[j]
col_df_name <- definicion_columnas_tabla3$Nombre_Col_df[j]
tipo_desc <- definicion_columnas_tabla3$Tipo_Descriptivo[j]
if(tipo_desc == "porcentaje"){
datos_fisher_m <- tabla_final_fisher %>% filter(Torneo_Base == torneo
_actual_data, Comparacion == etiqueta_comparacion_actual)
valor_display <- formatear_Fisher(datos_fisher_m$Odds_Ratio, datos_fi
sher_m$OR_CI_Lower, datos_fisher_m$OR_CI_Upper, datos_fisher_m$P_Valor)
} else {
datos_mw_m <- resultados_mann_whitney_con_conclusion %>%
filter(Comparacion == etiqueta_comparacion_actual, Variable_Testead
a == var_int)
valor_display <- formatear_MW(datos_mw_m$W_Statistic_MW, datos_mw_m$P
_Value_MW)
}
fila_mundial_test[[col_df_name]] <- valor_display
}
filas_para_tabla_gt <- append(filas_para_tabla_gt, list(fila_mundial_test
))
# --- SECCIÓN EUROCOPA ---
torneo_actual_label <- "Eurocopa" # Cómo se verá en la tabla
torneo_actual_data <- "EURO COPA" # Cómo está en tus datos
años_actuales <- años_euro
etiqueta_comparacion_actual <- comparaciones_por_torneo$`EURO COPA`$etiqu
eta_comp
fila_euro_año1 <- tibble(GT_Torneo_Grupo = torneo_actual_label, GT_Etique
ta_Fila = as.character(años_actuales[1]))
for(j in 1:nrow(definicion_columnas_tabla3)){
var_int <- definicion_columnas_tabla3$Variable_Interna[j]
col_df_name <- definicion_columnas_tabla3$Nombre_Col_df[j]
tipo_desc <- definicion_columnas_tabla3$Tipo_Descriptivo[j]
if(tipo_desc == "porcentaje"){
datos_fisher_e <- tabla_final_fisher %>% filter(Torneo_Base == torneo
_actual_data, Comparacion == etiqueta_comparacion_actual)
valor_display <- formatear_porcentaje_N(datos_fisher_e$Prop_Año1_Porc
, datos_fisher_e$Total_Año1)
} else {
datos_desc_e <- tabla_descriptivos_medianas %>%
filter(TORNEO == torneo_actual_data, YEAR == años_actuales[1], Vari
able_Analizada == var_int)
valor_display <- formatear_mediana_N(datos_desc_e$Mediana, datos_desc
_e$N_Obs)
}
fila_euro_año1[[col_df_name]] <- valor_display
}
filas_para_tabla_gt <- append(filas_para_tabla_gt, list(fila_euro_año1))
fila_euro_año2 <- tibble(GT_Torneo_Grupo = torneo_actual_label, GT_Etique
ta_Fila = as.character(años_actuales[2]))
for(j in 1:nrow(definicion_columnas_tabla3)){
var_int <- definicion_columnas_tabla3$Variable_Interna[j]
col_df_name <- definicion_columnas_tabla3$Nombre_Col_df[j]
tipo_desc <- definicion_columnas_tabla3$Tipo_Descriptivo[j]
if(tipo_desc == "porcentaje"){
datos_fisher_e <- tabla_final_fisher %>% filter(Torneo_Base == torneo
_actual_data, Comparacion == etiqueta_comparacion_actual)
valor_display <- formatear_porcentaje_N(datos_fisher_e$Prop_Año2_Porc
, datos_fisher_e$Total_Año2)
} else {
datos_desc_e <- tabla_descriptivos_medianas %>%
filter(TORNEO == torneo_actual_data, YEAR == años_actuales[2], Vari
able_Analizada == var_int)
valor_display <- formatear_mediana_N(datos_desc_e$Mediana, datos_desc
_e$N_Obs)
}
fila_euro_año2[[col_df_name]] <- valor_display
}
filas_para_tabla_gt <- append(filas_para_tabla_gt, list(fila_euro_año2))
fila_euro_total <- tibble(GT_Torneo_Grupo = torneo_actual_label, GT_Etiqu
eta_Fila = "Total")
for(j in 1:nrow(definicion_columnas_tabla3)){
var_int <- definicion_columnas_tabla3$Variable_Interna[j]
col_df_name <- definicion_columnas_tabla3$Nombre_Col_df[j]
tipo_desc <- definicion_columnas_tabla3$Tipo_Descriptivo[j]
if(tipo_desc == "porcentaje"){
total_efecto_stats_e <- efecto_anual_counts %>%
filter(TORNEO == torneo_actual_data, YEAR %in% años_actuales) %>%
summarise(sum_victorias = sum(victorias_marcando_primero, na.rm = T
RUE),
sum_partidos = sum(partidos_con_primer_gol_valido, na.rm
= TRUE)) %>%
mutate(PORC_Total = ifelse(sum_partidos > 0, (sum_victorias / sum_p
artidos) * 100, 0),
N_Total = sum_partidos)
valor_display <- formatear_porcentaje_N(total_efecto_stats_e$PORC_Tot
al, total_efecto_stats_e$N_Total)
} else {
descriptor_total_actual_e = paste0("Total ", torneo_actual_data, " ("
, paste(años_actuales, collapse = "+"), ")")
datos_desc_e <- tabla_descriptivos_medianas %>%
filter(TORNEO == torneo_actual_data, Grupo_Descriptor == descriptor
_total_actual_e, Variable_Analizada == var_int)
valor_display <- formatear_mediana_N(datos_desc_e$Mediana, datos_desc
_e$N_Obs)
}
fila_euro_total[[col_df_name]] <- valor_display
}
filas_para_tabla_gt <- append(filas_para_tabla_gt, list(fila_euro_total))
fila_euro_test <- tibble(GT_Torneo_Grupo = torneo_actual_label, GT_Etique
ta_Fila = "Mann-Whitney U / Fisher (p-valor)")
for(j in 1:nrow(definicion_columnas_tabla3)){
var_int <- definicion_columnas_tabla3$Variable_Interna[j]
col_df_name <- definicion_columnas_tabla3$Nombre_Col_df[j]
tipo_desc <- definicion_columnas_tabla3$Tipo_Descriptivo[j]
if(tipo_desc == "porcentaje"){
datos_fisher_e <- tabla_final_fisher %>% filter(Torneo_Base == torneo
_actual_data, Comparacion == etiqueta_comparacion_actual)
valor_display <- formatear_Fisher(datos_fisher_e$Odds_Ratio, datos_fi
sher_e$OR_CI_Lower, datos_fisher_e$OR_CI_Upper, datos_fisher_e$P_Valor)
} else {
datos_mw_e <- resultados_mann_whitney_con_conclusion %>%
filter(Comparacion == etiqueta_comparacion_actual, Variable_Testead
a == var_int)
valor_display <- formatear_MW(datos_mw_e$W_Statistic_MW, datos_mw_e$P
_Value_MW)
}
fila_euro_test[[col_df_name]] <- valor_display
}
filas_para_tabla_gt <- append(filas_para_tabla_gt, list(fila_euro_test))
# --- Combinar todas las filas en un único dataframe ---
df_para_tabla3_final <- bind_rows(filas_para_tabla_gt)
# View(df_para_tabla3_final)
#######
# Crear los nombres de las columnas para gt a partir de la definición
nombres_columnas_gt <- setNames(
definicion_columnas_tabla3$Encabezado_GT,
definicion_columnas_tabla3$Nombre_Col_df
)
tabla3_gt <- df_para_tabla3_final %>%
gt(groupname_col = "GT_Torneo_Grupo", rowname_col = "GT_Etiqueta_Fila")
%>%
cols_label(
.list = nombres_columnas_gt
) %>%
tab_header(
title = md("**Tabla 3: Diferencias en variables de goles en función d
el año entre Mundial y Eurocopa**")
) %>%
cols_align(
align = "center",
columns = all_of(definicion_columnas_tabla3$Nombre_Col_df)
) %>%
tab_style(
style = list(
cell_text(style = "italic")
),
locations = cells_body(
rows = GT_Etiqueta_Fila == "Mann-Whitney U / Fisher (p-valor)"
)
) %>%
tab_style(
style = list(
cell_text(weight = "bold")
),
locations = cells_body(
rows = GT_Etiqueta_Fila == "Total"
)
) %>%
tab_footnote(
footnote = md("* p<0.05; ** p<0.01; *** p<0.001")
)
# Imprimir la tabla final
print(tabla3_gt)
## <div id="jnvqnaewem" style="padding-left:0px;padding-right:0px;padding
-top:10px;padding-bottom:10px;overflow-x:auto;overflow-y:auto;width:auto;
height:auto;">
## <style>#jnvqnaewem table {
## font-family: system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-s
erif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Col
or Emoji';
## -webkit-font-smoothing: antialiased;
## -moz-osx-font-smoothing: grayscale;
## }
##
## #jnvqnaewem thead, #jnvqnaewem tbody, #jnvqnaewem tfoot, #jnvqnaewem t
r, #jnvqnaewem td, #jnvqnaewem th {
## border-style: none;
## }
##
## #jnvqnaewem p {
## margin: 0;
## padding: 0;
## }
##
## #jnvqnaewem .gt_table {
## display: table;
## border-collapse: collapse;
## line-height: normal;
## margin-left: auto;
## margin-right: auto;
## color: #333333;
## font-size: 16px;
## font-weight: normal;
## font-style: normal;
## background-color: #FFFFFF;
## width: auto;
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #A8A8A8;
## border-right-style: none;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #A8A8A8;
## border-left-style: none;
## border-left-width: 2px;
## border-left-color: #D3D3D3;
## }
##
## #jnvqnaewem .gt_caption {
## padding-top: 4px;
## padding-bottom: 4px;
## }
##
## #jnvqnaewem .gt_title {
## color: #333333;
## font-size: 125%;
## font-weight: initial;
## padding-top: 4px;
## padding-bottom: 4px;
## padding-left: 5px;
## padding-right: 5px;
## border-bottom-color: #FFFFFF;
## border-bottom-width: 0;
## }
##
## #jnvqnaewem .gt_subtitle {
## color: #333333;
## font-size: 85%;
## font-weight: initial;
## padding-top: 3px;
## padding-bottom: 5px;
## padding-left: 5px;
## padding-right: 5px;
## border-top-color: #FFFFFF;
## border-top-width: 0;
## }
##
## #jnvqnaewem .gt_heading {
## background-color: #FFFFFF;
## text-align: center;
## border-bottom-color: #FFFFFF;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## }
##
## #jnvqnaewem .gt_bottom_border {
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## }
##
## #jnvqnaewem .gt_col_headings {
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## }
##
## #jnvqnaewem .gt_col_heading {
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: normal;
## text-transform: inherit;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## vertical-align: bottom;
## padding-top: 5px;
## padding-bottom: 6px;
## padding-left: 5px;
## padding-right: 5px;
## overflow-x: hidden;
## }
##
## #jnvqnaewem .gt_column_spanner_outer {
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: normal;
## text-transform: inherit;
## padding-top: 0;
## padding-bottom: 0;
## padding-left: 4px;
## padding-right: 4px;
## }
##
## #jnvqnaewem .gt_column_spanner_outer:first-child {
## padding-left: 0;
## }
##
## #jnvqnaewem .gt_column_spanner_outer:last-child {
## padding-right: 0;
## }
##
## #jnvqnaewem .gt_column_spanner {
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## vertical-align: bottom;
## padding-top: 5px;
## padding-bottom: 5px;
## overflow-x: hidden;
## display: inline-block;
## width: 100%;
## }
##
## #jnvqnaewem .gt_spanner_row {
## border-bottom-style: hidden;
## }
##
## #jnvqnaewem .gt_group_heading {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: initial;
## text-transform: inherit;
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## vertical-align: middle;
## text-align: left;
## }
##
## #jnvqnaewem .gt_empty_group_heading {
## padding: 0.5px;
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: initial;
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## vertical-align: middle;
## }
##
## #jnvqnaewem .gt_from_md > :first-child {
## margin-top: 0;
## }
##
## #jnvqnaewem .gt_from_md > :last-child {
## margin-bottom: 0;
## }
##
## #jnvqnaewem .gt_row {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## margin: 10px;
## border-top-style: solid;
## border-top-width: 1px;
## border-top-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 1px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 1px;
## border-right-color: #D3D3D3;
## vertical-align: middle;
## overflow-x: hidden;
## }
##
## #jnvqnaewem .gt_stub {
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: initial;
## text-transform: inherit;
## border-right-style: solid;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #jnvqnaewem .gt_stub_row_group {
## color: #333333;
## background-color: #FFFFFF;
## font-size: 100%;
## font-weight: initial;
## text-transform: inherit;
## border-right-style: solid;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## padding-left: 5px;
## padding-right: 5px;
## vertical-align: top;
## }
##
## #jnvqnaewem .gt_row_group_first td {
## border-top-width: 2px;
## }
##
## #jnvqnaewem .gt_row_group_first th {
## border-top-width: 2px;
## }
##
## #jnvqnaewem .gt_summary_row {
## color: #333333;
## background-color: #FFFFFF;
## text-transform: inherit;
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #jnvqnaewem .gt_first_summary_row {
## border-top-style: solid;
## border-top-color: #D3D3D3;
## }
##
## #jnvqnaewem .gt_first_summary_row.thick {
## border-top-width: 2px;
## }
##
## #jnvqnaewem .gt_last_summary_row {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## }
##
## #jnvqnaewem .gt_grand_summary_row {
## color: #333333;
## background-color: #FFFFFF;
## text-transform: inherit;
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #jnvqnaewem .gt_first_grand_summary_row {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## border-top-style: double;
## border-top-width: 6px;
## border-top-color: #D3D3D3;
## }
##
## #jnvqnaewem .gt_last_grand_summary_row_top {
## padding-top: 8px;
## padding-bottom: 8px;
## padding-left: 5px;
## padding-right: 5px;
## border-bottom-style: double;
## border-bottom-width: 6px;
## border-bottom-color: #D3D3D3;
## }
##
## #jnvqnaewem .gt_striped {
## background-color: rgba(128, 128, 128, 0.05);
## }
##
## #jnvqnaewem .gt_table_body {
## border-top-style: solid;
## border-top-width: 2px;
## border-top-color: #D3D3D3;
## border-bottom-style: solid;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## }
##
## #jnvqnaewem .gt_footnotes {
## color: #333333;
## background-color: #FFFFFF;
## border-bottom-style: none;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 2px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## }
##
## #jnvqnaewem .gt_footnote {
## margin: 0px;
## font-size: 90%;
## padding-top: 4px;
## padding-bottom: 4px;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #jnvqnaewem .gt_sourcenotes {
## color: #333333;
## background-color: #FFFFFF;
## border-bottom-style: none;
## border-bottom-width: 2px;
## border-bottom-color: #D3D3D3;
## border-left-style: none;
## border-left-width: 2px;
## border-left-color: #D3D3D3;
## border-right-style: none;
## border-right-width: 2px;
## border-right-color: #D3D3D3;
## }
##
## #jnvqnaewem .gt_sourcenote {
## font-size: 90%;
## padding-top: 4px;
## padding-bottom: 4px;
## padding-left: 5px;
## padding-right: 5px;
## }
##
## #jnvqnaewem .gt_left {
## text-align: left;
## }
##
## #jnvqnaewem .gt_center {
## text-align: center;
## }
##
## #jnvqnaewem .gt_right {
## text-align: right;
## font-variant-numeric: tabular-nums;
## }
##
## #jnvqnaewem .gt_font_normal {
## font-weight: normal;
## }
##
## #jnvqnaewem .gt_font_bold {
## font-weight: bold;
## }
##
## #jnvqnaewem .gt_font_italic {
## font-style: italic;
## }
##
## #jnvqnaewem .gt_super {
## font-size: 65%;
## }
##
## #jnvqnaewem .gt_footnote_marks {
## font-size: 75%;
## vertical-align: 0.4em;
## position: initial;
## }
##
## #jnvqnaewem .gt_asterisk {
## font-size: 100%;
## vertical-align: 0;
## }
##
## #jnvqnaewem .gt_indent_1 {
## text-indent: 5px;
## }
##
## #jnvqnaewem .gt_indent_2 {
## text-indent: 10px;
## }
##
## #jnvqnaewem .gt_indent_3 {
## text-indent: 15px;
## }
##
## #jnvqnaewem .gt_indent_4 {
## text-indent: 20px;
## }
##
## #jnvqnaewem .gt_indent_5 {
## text-indent: 25px;
## }
##
## #jnvqnaewem .katex-display {
## display: inline-flex !important;
## margin-bottom: 0.75em !important;
## }
##
## #jnvqnaewem div.Reactable > div.rt-table > div.rt-thead > div.rt-tr.rt
-tr-group-header > div.rt-th-group:after {
## height: 0px !important;
## }
## </style>
## <table class="gt_table" data-quarto-disable-processing="false" data-
quarto-bootstrap="false">
## <thead>
## <tr class="gt_heading">
## <td colspan="11" class="gt_heading gt_title gt_font_normal gt_bo
ttom_border" style><span class='gt_from_md'><strong>Tabla 3: Diferencias
en variables de goles en función del año entre Mundial y Eurocopa</strong
></span></td>
## </tr>
##
## <tr class="gt_col_headings">
## <th class="gt_col_heading gt_columns_bottom_border gt_left" rows
pan="1" colspan="1" scope="col" id="a::stub"></th>
## <th class="gt_col_heading gt_columns_bottom_border gt_center" ro
wspan="1" colspan="1" scope="col" id="Efecto.marcar.primero.equipo.ganado
r....">Efecto marcar primero equipo ganador (%)</th>
## <th class="gt_col_heading gt_columns_bottom_border gt_center" ro
wspan="1" colspan="1" scope="col" id="Goles.totales.por.partido..Mediana.
.N..">Goles totales por partido (Mediana (N))</th>
## <th class="gt_col_heading gt_columns_bottom_border gt_center" ro
wspan="1" colspan="1" scope="col" id="Goles.periodo.0.15.min..Mediana..N.
.">Goles periodo 0-15 min (Mediana (N))</th>
## <th class="gt_col_heading gt_columns_bottom_border gt_center" ro
wspan="1" colspan="1" scope="col" id="Goles.periodo.16.30.min..Mediana..N
..">Goles periodo 16-30 min (Mediana (N))</th>
## <th class="gt_col_heading gt_columns_bottom_border gt_center" ro
wspan="1" colspan="1" scope="col" id="Goles.periodo.31.45.min..Mediana..N
..">Goles periodo 31-45 min (Mediana (N))</th>
## <th class="gt_col_heading gt_columns_bottom_border gt_center" ro
wspan="1" colspan="1" scope="col" id="Goles.periodo.46.60.min..Mediana..N
..">Goles periodo 46-60 min (Mediana (N))</th>
## <th class="gt_col_heading gt_columns_bottom_border gt_center" ro
wspan="1" colspan="1" scope="col" id="Goles.periodo.61.75.min..Mediana..N
..">Goles periodo 61-75 min (Mediana (N))</th>
## <th class="gt_col_heading gt_columns_bottom_border gt_center" ro
wspan="1" colspan="1" scope="col" id="Goles.periodo.76.90.min..Mediana..N
..">Goles periodo 76-90 min (Mediana (N))</th>
## <th class="gt_col_heading gt_columns_bottom_border gt_center" ro
wspan="1" colspan="1" scope="col" id="Minuto.primer.gol.equipo.ganador..M
ediana..N..">Minuto primer gol equipo ganador (Mediana (N))</th>
## <th class="gt_col_heading gt_columns_bottom_border gt_center" ro
wspan="1" colspan="1" scope="col" id="Minuto.primer.gol.equipo.perdedor..
Mediana..N..">Minuto primer gol equipo perdedor (Mediana (N))</th>
## </tr>
## </thead>
## <tbody class="gt_table_body">
## <tr class="gt_group_heading_row">
## <th colspan="11" class="gt_group_heading" scope="colgroup" id="M
undial">Mundial</th>
## </tr>
## <tr class="gt_row_group_first"><th id="stub_1_1" scope="row" class
="gt_row gt_left gt_stub">2018</th>
## <td headers="Mundial stub_1_1 Efecto.marcar.primero.equipo.ganador....
" class="gt_row gt_center">68.8% (N=16)</td>
## <td headers="Mundial stub_1_1 Goles.totales.por.partido..Mediana..N.."
class="gt_row gt_center">2.00 (N=16)</td>
## <td headers="Mundial stub_1_1 Goles.periodo.0.15.min..Mediana..N.." cl
ass="gt_row gt_center">0.00 (N=16)</td>
## <td headers="Mundial stub_1_1 Goles.periodo.16.30.min..Mediana..N.." c
lass="gt_row gt_center">0.00 (N=16)</td>
## <td headers="Mundial stub_1_1 Goles.periodo.31.45.min..Mediana..N.." c
lass="gt_row gt_center">0.00 (N=16)</td>
## <td headers="Mundial stub_1_1 Goles.periodo.46.60.min..Mediana..N.." c
lass="gt_row gt_center">0.50 (N=16)</td>
## <td headers="Mundial stub_1_1 Goles.periodo.61.75.min..Mediana..N.." c
lass="gt_row gt_center">0.00 (N=16)</td>
## <td headers="Mundial stub_1_1 Goles.periodo.76.90.min..Mediana..N.." c
lass="gt_row gt_center">0.00 (N=16)</td>
## <td headers="Mundial stub_1_1 Minuto.primer.gol.equipo.ganador..Median
a..N.." class="gt_row gt_center">39.50 (N=16)</td>
## <td headers="Mundial stub_1_1 Minuto.primer.gol.equipo.perdedor..Media
na..N.." class="gt_row gt_center">36.00 (N=10)</td></tr>
## <tr><th id="stub_1_2" scope="row" class="gt_row gt_left gt_stub">2
022</th>
## <td headers="Mundial stub_1_2 Efecto.marcar.primero.equipo.ganador....
" class="gt_row gt_center">92.9% (N=14)</td>
## <td headers="Mundial stub_1_2 Goles.totales.por.partido..Mediana..N.."
class="gt_row gt_center">3.00 (N=14)</td>
## <td headers="Mundial stub_1_2 Goles.periodo.0.15.min..Mediana..N.." cl
ass="gt_row gt_center">0.00 (N=14)</td>
## <td headers="Mundial stub_1_2 Goles.periodo.16.30.min..Mediana..N.." c
lass="gt_row gt_center">0.00 (N=14)</td>
## <td headers="Mundial stub_1_2 Goles.periodo.31.45.min..Mediana..N.." c
lass="gt_row gt_center">1.00 (N=14)</td>
## <td headers="Mundial stub_1_2 Goles.periodo.46.60.min..Mediana..N.." c
lass="gt_row gt_center">0.00 (N=14)</td>
## <td headers="Mundial stub_1_2 Goles.periodo.61.75.min..Mediana..N.." c
lass="gt_row gt_center">0.00 (N=14)</td>
## <td headers="Mundial stub_1_2 Goles.periodo.76.90.min..Mediana..N.." c
lass="gt_row gt_center">1.00 (N=14)</td>
## <td headers="Mundial stub_1_2 Minuto.primer.gol.equipo.ganador..Median
a..N.." class="gt_row gt_center">28.50 (N=14)</td>
## <td headers="Mundial stub_1_2 Minuto.primer.gol.equipo.perdedor..Media
na..N.." class="gt_row gt_center">76.00 (N=10)</td></tr>
## <tr><th id="stub_1_3" scope="row" class="gt_row gt_left gt_stub">T
otal</th>
## <td headers="Mundial stub_1_3 Efecto.marcar.primero.equipo.ganador....
" class="gt_row gt_center" style="font-weight: bold;">80.0% (N=30)</td>
## <td headers="Mundial stub_1_3 Goles.totales.por.partido..Mediana..N.."
class="gt_row gt_center" style="font-weight: bold;">3.00 (N=30)</td>
## <td headers="Mundial stub_1_3 Goles.periodo.0.15.min..Mediana..N.." cl
ass="gt_row gt_center" style="font-weight: bold;">0.00 (N=30)</td>
## <td headers="Mundial stub_1_3 Goles.periodo.16.30.min..Mediana..N.." c
lass="gt_row gt_center" style="font-weight: bold;">0.00 (N=30)</td>
## <td headers="Mundial stub_1_3 Goles.periodo.31.45.min..Mediana..N.." c
lass="gt_row gt_center" style="font-weight: bold;">1.00 (N=30)</td>
## <td headers="Mundial stub_1_3 Goles.periodo.46.60.min..Mediana..N.." c
lass="gt_row gt_center" style="font-weight: bold;">0.00 (N=30)</td>
## <td headers="Mundial stub_1_3 Goles.periodo.61.75.min..Mediana..N.." c
lass="gt_row gt_center" style="font-weight: bold;">0.00 (N=30)</td>
## <td headers="Mundial stub_1_3 Goles.periodo.76.90.min..Mediana..N.." c
lass="gt_row gt_center" style="font-weight: bold;">0.50 (N=30)</td>
## <td headers="Mundial stub_1_3 Minuto.primer.gol.equipo.ganador..Median
a..N.." class="gt_row gt_center" style="font-weight: bold;">34.50 (N=30)<
/td>
## <td headers="Mundial stub_1_3 Minuto.primer.gol.equipo.perdedor..Media
na..N.." class="gt_row gt_center" style="font-weight: bold;">54.50 (N=20)
</td></tr>
## <tr><th id="stub_1_4" scope="row" class="gt_row gt_left gt_stub">M
ann-Whitney U / Fisher (p-valor)</th>
## <td headers="Mundial stub_1_4 Efecto.marcar.primero.equipo.ganador....
" class="gt_row gt_center" style="font-style: italic;">0.18 [0.00-1.95] (
p=0.18)</td>
## <td headers="Mundial stub_1_4 Goles.totales.por.partido..Mediana..N.."
class="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Mundial stub_1_4 Goles.periodo.0.15.min..Mediana..N.." cl
ass="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Mundial stub_1_4 Goles.periodo.16.30.min..Mediana..N.." c
lass="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Mundial stub_1_4 Goles.periodo.31.45.min..Mediana..N.." c
lass="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Mundial stub_1_4 Goles.periodo.46.60.min..Mediana..N.." c
lass="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Mundial stub_1_4 Goles.periodo.61.75.min..Mediana..N.." c
lass="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Mundial stub_1_4 Goles.periodo.76.90.min..Mediana..N.." c
lass="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Mundial stub_1_4 Minuto.primer.gol.equipo.ganador..Median
a..N.." class="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Mundial stub_1_4 Minuto.primer.gol.equipo.perdedor..Media
na..N.." class="gt_row gt_center" style="font-style: italic;">-</td></tr>
## <tr class="gt_group_heading_row">
## <th colspan="11" class="gt_group_heading" scope="colgroup" id="E
urocopa">Eurocopa</th>
## </tr>
## <tr class="gt_row_group_first"><th id="stub_1_5" scope="row" class
="gt_row gt_left gt_stub">2020</th>
## <td headers="Eurocopa stub_1_5 Efecto.marcar.primero.equipo.ganador...
." class="gt_row gt_center">78.6% (N=14)</td>
## <td headers="Eurocopa stub_1_5 Goles.totales.por.partido..Mediana..N..
" class="gt_row gt_center">2.00 (N=14)</td>
## <td headers="Eurocopa stub_1_5 Goles.periodo.0.15.min..Mediana..N.." c
lass="gt_row gt_center">0.00 (N=14)</td>
## <td headers="Eurocopa stub_1_5 Goles.periodo.16.30.min..Mediana..N.."
class="gt_row gt_center">0.00 (N=14)</td>
## <td headers="Eurocopa stub_1_5 Goles.periodo.31.45.min..Mediana..N.."
class="gt_row gt_center">0.00 (N=14)</td>
## <td headers="Eurocopa stub_1_5 Goles.periodo.46.60.min..Mediana..N.."
class="gt_row gt_center">0.00 (N=14)</td>
## <td headers="Eurocopa stub_1_5 Goles.periodo.61.75.min..Mediana..N.."
class="gt_row gt_center">0.00 (N=14)</td>
## <td headers="Eurocopa stub_1_5 Goles.periodo.76.90.min..Mediana..N.."
class="gt_row gt_center">0.00 (N=14)</td>
## <td headers="Eurocopa stub_1_5 Minuto.primer.gol.equipo.ganador..Media
na..N.." class="gt_row gt_center">34.50 (N=14)</td>
## <td headers="Eurocopa stub_1_5 Minuto.primer.gol.equipo.perdedor..Medi
ana..N.." class="gt_row gt_center">45.00 (N=9)</td></tr>
## <tr><th id="stub_1_6" scope="row" class="gt_row gt_left gt_stub">2
024</th>
## <td headers="Eurocopa stub_1_6 Efecto.marcar.primero.equipo.ganador...
." class="gt_row gt_center">53.8% (N=13)</td>
## <td headers="Eurocopa stub_1_6 Goles.totales.por.partido..Mediana..N..
" class="gt_row gt_center">3.00 (N=13)</td>
## <td headers="Eurocopa stub_1_6 Goles.periodo.0.15.min..Mediana..N.." c
lass="gt_row gt_center">0.00 (N=13)</td>
## <td headers="Eurocopa stub_1_6 Goles.periodo.16.30.min..Mediana..N.."
class="gt_row gt_center">0.00 (N=13)</td>
## <td headers="Eurocopa stub_1_6 Goles.periodo.31.45.min..Mediana..N.."
class="gt_row gt_center">0.00 (N=13)</td>
## <td headers="Eurocopa stub_1_6 Goles.periodo.46.60.min..Mediana..N.."
class="gt_row gt_center">0.00 (N=13)</td>
## <td headers="Eurocopa stub_1_6 Goles.periodo.61.75.min..Mediana..N.."
class="gt_row gt_center">0.00 (N=13)</td>
## <td headers="Eurocopa stub_1_6 Goles.periodo.76.90.min..Mediana..N.."
class="gt_row gt_center">1.00 (N=13)</td>
## <td headers="Eurocopa stub_1_6 Minuto.primer.gol.equipo.ganador..Media
na..N.." class="gt_row gt_center">47.00 (N=13)</td>
## <td headers="Eurocopa stub_1_6 Minuto.primer.gol.equipo.perdedor..Medi
ana..N.." class="gt_row gt_center">35.00 (N=9)</td></tr>
## <tr><th id="stub_1_7" scope="row" class="gt_row gt_left gt_stub">T
otal</th>
## <td headers="Eurocopa stub_1_7 Efecto.marcar.primero.equipo.ganador...
." class="gt_row gt_center" style="font-weight: bold;">66.7% (N=27)</td>
## <td headers="Eurocopa stub_1_7 Goles.totales.por.partido..Mediana..N..
" class="gt_row gt_center" style="font-weight: bold;">2.00 (N=27)</td>
## <td headers="Eurocopa stub_1_7 Goles.periodo.0.15.min..Mediana..N.." c
lass="gt_row gt_center" style="font-weight: bold;">0.00 (N=27)</td>
## <td headers="Eurocopa stub_1_7 Goles.periodo.16.30.min..Mediana..N.."
class="gt_row gt_center" style="font-weight: bold;">0.00 (N=27)</td>
## <td headers="Eurocopa stub_1_7 Goles.periodo.31.45.min..Mediana..N.."
class="gt_row gt_center" style="font-weight: bold;">0.00 (N=27)</td>
## <td headers="Eurocopa stub_1_7 Goles.periodo.46.60.min..Mediana..N.."
class="gt_row gt_center" style="font-weight: bold;">0.00 (N=27)</td>
## <td headers="Eurocopa stub_1_7 Goles.periodo.61.75.min..Mediana..N.."
class="gt_row gt_center" style="font-weight: bold;">0.00 (N=27)</td>
## <td headers="Eurocopa stub_1_7 Goles.periodo.76.90.min..Mediana..N.."
class="gt_row gt_center" style="font-weight: bold;">1.00 (N=27)</td>
## <td headers="Eurocopa stub_1_7 Minuto.primer.gol.equipo.ganador..Media
na..N.." class="gt_row gt_center" style="font-weight: bold;">39.00 (N=27)
</td>
## <td headers="Eurocopa stub_1_7 Minuto.primer.gol.equipo.perdedor..Medi
ana..N.." class="gt_row gt_center" style="font-weight: bold;">44.00 (N=18
)</td></tr>
## <tr><th id="stub_1_8" scope="row" class="gt_row gt_left gt_stub">M
ann-Whitney U / Fisher (p-valor)</th>
## <td headers="Eurocopa stub_1_8 Efecto.marcar.primero.equipo.ganador...
." class="gt_row gt_center" style="font-style: italic;">3.01 [0.46-25.05]
(p=0.24)</td>
## <td headers="Eurocopa stub_1_8 Goles.totales.por.partido..Mediana..N..
" class="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Eurocopa stub_1_8 Goles.periodo.0.15.min..Mediana..N.." c
lass="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Eurocopa stub_1_8 Goles.periodo.16.30.min..Mediana..N.."
class="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Eurocopa stub_1_8 Goles.periodo.31.45.min..Mediana..N.."
class="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Eurocopa stub_1_8 Goles.periodo.46.60.min..Mediana..N.."
class="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Eurocopa stub_1_8 Goles.periodo.61.75.min..Mediana..N.."
class="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Eurocopa stub_1_8 Goles.periodo.76.90.min..Mediana..N.."
class="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Eurocopa stub_1_8 Minuto.primer.gol.equipo.ganador..Media
na..N.." class="gt_row gt_center" style="font-style: italic;">-</td>
## <td headers="Eurocopa stub_1_8 Minuto.primer.gol.equipo.perdedor..Medi
ana..N.." class="gt_row gt_center" style="font-style: italic;">-</td></tr
>
## </tbody>
##
## <tfoot class="gt_footnotes">
## <tr>
## <td class="gt_footnote" colspan="11"> <span class='gt_from_md'><
ul>
## <li>p&lt;0.05; ** p&lt;0.01; *** p&lt;0.001</li>
## </ul>
## </span></td>
## </tr>
## </tfoot>
## </table>
## </div>
#########################################################
# Calcular la probabilidad de ganar para el equipo que anota primero,
# desglosado por si fue LOCAL o VISITANTE y por PERÍODO del primer gol.
probabilidades_ganar <- datos_goles %>%
filter(P_GOL_1 %in% c("1", "2", "3", "4", "5", "6")) %>%
# Agrupamos por quién anotó el primer gol y en qué período
group_by(PRIM_GOL, P_GOL_1) %>%
summarise(
total_partidos_condicion = n(),
veces_gano_quien_anoto_primero = sum(PRIM_GOL == GANO),
.groups = 'drop'
) %>%
mutate(
prob_ganar = veces_gano_quien_anoto_primero / total_partidos_condicio
n
) %>%
arrange(PRIM_GOL, P_GOL_1)
# Mostrar la tabla de probabilidades
# view(probabilidades_ganar)
# tabla separada
prob_ganar_local <- probabilidades_ganar %>%
filter(PRIM_GOL == "local")
prob_ganar_visitante <- probabilidades_ganar %>%
filter(PRIM_GOL == "visitante")
print("Probabilidad de Ganar si LOCAL anota primero:")
## [1] "Probabilidad de Ganar si LOCAL anota primero:"
print(prob_ganar_local)
## # A tibble: 6 × 5
## PRIM_GOL P_GOL_1 total_partidos_condicion veces_gano_quien_anoto_…¹
prob_ganar
## <fct> <fct> <int> <int>
<dbl>
## 1 local 1 9 7
0.778
## 2 local 2 4 3
0.75
## 3 local 3 9 7
0.778
## 4 local 4 6 6
1
## 5 local 5 1 1
1
## 6 local 6 2 2
1
## # abbreviated name: ¹veces_gano_quien_anoto_primero
print("Probabilidad de Ganar si VISITANTE anota primero:")
## [1] "Probabilidad de Ganar si VISITANTE anota primero:"
print(prob_ganar_visitante)
## # A tibble: 5 × 5
## PRIM_GOL P_GOL_1 total_partidos_condicion veces_gano_quien_anoto…¹
prob_ganar
## <fct> <fct> <int> <int>
<dbl>
## 1 visitante 1 10 6
0.6
## 2 visitante 2 8 5
0.625
## 3 visitante 3 4 3
0.75
## 4 visitante 4 2 1
0.5
## 5 visitante 5 2 1
0.5
## # abbreviated name: ¹veces_gano_quien_anoto_primero
# Preparamos etiquetas para el gráfico (N de cada barra)
probabilidades_ganar_para_plot <- probabilidades_ganar %>%
mutate(
etiqueta_prob = paste0(round(prob_ganar * 100, 1), "%\n(N=", total_pa
rtidos_condicion, ")")
)
# Gráfico de barras
ggplot(probabilidades_ganar_para_plot, aes(x = factor(P_GOL_1), y = prob_
ganar, fill = PRIM_GOL)) +
geom_bar(stat = "identity", position = position_dodge(preserve = "singl
e")) +
geom_text(
aes(label = etiqueta_prob),
position = position_dodge(width = 0.9),
vjust = -0.5,
size = 3
) +
scale_y_continuous(labels = scales::percent_format(), limits = c(0, 1.1
), breaks = seq(0, 1, 0.25)) +
scale_fill_manual(
values = c("local" = "#342BA8", "visitante" = "#D93E1F"),
name = "Equipo que Anotó Primero"
) +
labs(
title = "Probabilidad de Ganar al Anotar el Primer Gol, por Período y
Equipo",
subtitle = "Basado en Mundiales y Eurocopas (2018-2024), N=57 partido
s con primer gol en tiempo reglamentario",
x = "Período del Primer Gol (1=0-15min, 2=16-30min, etc.)",
y = "Probabilidad de Ganar"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5),
legend.position = "top"
)
###pobabilidades de ganar si anota en el tiempo x para caualquier equipo#
###################
# Calcular la probabilidad de ganar para el equipo que anota primero (AGR
EGANDO LOCAL Y VISITANTE),
# desglosado solo por PERÍODO del primer gol.
probabilidades_ganar_agregado <- datos_goles %>%
# Nos aseguramos de que solo consideramos los 6 períodos de tiempo regl
amentario
filter(P_GOL_1 %in% c("1", "2", "3", "4", "5", "6")) %>%
# Agrupamos solo por el período en que ocurrió el primer gol
group_by(P_GOL_1) %>%
summarise(
total_partidos_primer_gol_en_periodo = n(),
veces_gano_quien_anoto_primero_agregado = sum(PRIM_GOL == GANO),
.groups = 'drop'
) %>%
mutate(
prob_ganar_agg = veces_gano_quien_anoto_primero_agregado / total_part
idos_primer_gol_en_periodo
) %>%
arrange(P_GOL_1)
# Mostrar la tabla de probabilidades agregada
print(probabilidades_ganar_agregado)
## # A tibble: 6 × 4
## P_GOL_1 total_partidos_primer_gol_en_p…¹ veces_gano_quien_ano…² prob
_ganar_agg
## <fct> <int> <int>
<dbl>
## 1 1 19 13
0.684
## 2 2 12 8
0.667
## 3 3 13 10
0.769
## 4 4 8 7
0.875
## 5 5 3 2
0.667
## 6 6 2 2
1
## # abbreviated names: ¹total_partidos_primer_gol_en_periodo,
## # ²veces_gano_quien_anoto_primero_agregado
# Visualizar las probabilidades agregadas
probabilidades_ganar_agregado_para_plot <- probabilidades_ganar_agregado
%>%
mutate(
etiqueta_prob_agg = paste0(round(prob_ganar_agg * 100, 1), "%\n(N=",
total_partidos_primer_gol_en_periodo, ")")
)
ggplot(probabilidades_ganar_agregado_para_plot, aes(x = factor(P_GOL_1),
y = prob_ganar_agg)) +
geom_bar(stat = "identity", fill = "#342BA8") +
geom_text(
aes(label = etiqueta_prob_agg),
vjust = -0.5,
size = 3.5
) +
scale_y_continuous(labels = scales::percent_format(), limits = c(0, 1.1
), breaks = seq(0, 1, 0.25)) +
labs(
title = "Probabilidad de Ganar al Anotar el Primer Gol (Agregado Loca
l/Visitante)",
subtitle = "Basado en Mundiales y Eurocopas (2018-2024), N=57 partido
s con primer gol en tiempo reglamentario",
x = "Período del Primer Gol (1=0-15min, 2=16-30min, etc.)",
y = "Probabilidad de Ganar"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5)
)
#regresion logistica#####################################################
####
# Paso 1: Crear la variable dependiente binaria GanoQuienMarcoPrimero
# 1 si el equipo que anotó el primer gol, ganó el partido.
# 0 si el equipo que anotó el primer gol, NO ganó el partido.
datos_goles <- datos_goles %>%
mutate(
GanoQuienMarcoPrimero = ifelse(PRIM_GOL == GANO, 1, 0)
)
# Verificar la nueva variable (opcional, pero recomendado)
print(table(datos_goles$GanoQuienMarcoPrimero, useNA = "ifany"))
##
## 0 1
## 15 42
# Paso 2: Asegurarse de que P_GOL_1 es un factor y establecer un nivel de
referencia (opcional pero bueno para la interpretación)
datos_goles_para_modelo <- datos_goles %>%
filter(P_GOL_1 %in% c("1", "2", "3", "4", "5", "6")) %>%
mutate(P_GOL_1_factor = factor(P_GOL_1))
# Paso 3: Ajustar el modelo de regresión logística
# Modelo: GanoQuienMarcoPrimero en función del período del primer gol
modelo_logistico <- glm(GanoQuienMarcoPrimero ~ P_GOL_1_factor,
data = datos_goles_para_modelo,
family = binomial(link = "logit"))
# Paso 4: Ver el resumen del modelo
print(summary(modelo_logistico))
##
## Call:
## glm(formula = GanoQuienMarcoPrimero ~ P_GOL_1_factor, family = binomia
l(link = "logit"),
## data = datos_goles_para_modelo)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.77319 0.49355 1.567 0.117
## P_GOL_1_factor2 -0.08004 0.78650 -0.102 0.919
## P_GOL_1_factor3 0.43078 0.82275 0.524 0.601
## P_GOL_1_factor4 1.17272 1.17747 0.996 0.319
## P_GOL_1_factor5 -0.08004 1.32045 -0.061 0.952
## P_GOL_1_factor6 15.79288 1696.73441 0.009 0.993
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 65.702 on 56 degrees of freedom
## Residual deviance: 62.868 on 51 degrees of freedom
## AIC: 74.868
##
## Number of Fisher Scoring iterations: 15
# Otra forma de obtener OR y CI (sin broom, un poco más manual):
coeficientes_log_odds <- coef(modelo_logistico)
odds_ratios <- exp(coeficientes_log_odds)
conf_int_log_odds <- confint(modelo_logistico)
## Waiting for profiling to be done...
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
conf_int_odds_ratios <- exp(conf_int_log_odds)
print("Odds Ratios:")
## [1] "Odds Ratios:"
# view(odds_ratios)
print("Intervalos de Confianza para Odds Ratios (95%):")
## [1] "Intervalos de Confianza para Odds Ratios (95%):"
# view(conf_int_odds_ratios)